Prendere il seguente pezzo di codice:NSJSONSerialization deserializza i numeri come NSDecimalNumber?
NSError *error;
NSString *myJSONString = @"{ \"foo\" : 0.1}";
NSData *jsonData = [myJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
La mia domanda è, è un results[@"foo"]
NSDecimalNumber, o qualcosa con precisione finita binario come un doppio o galleggiante? Fondamentalmente, ho un'applicazione che richiede l'accuratezza senza perdita che viene fornita con uno NSDecimalNumber
, e ho bisogno di assicurare che la deserializzazione JSON non comporti arrotondamenti a causa di double/float eccetera.
E.g. se è stato interpretato come un galleggiante, mi piacerebbe correre in problemi come questo con precisione:
float baz = 0.1;
NSLog(@"baz: %.20f", baz);
// prints baz: 0.10000000149011611938
ho provato interpretare foo
come NSDecimalNumber e stampare il risultato:
NSDecimalNumber *fooAsDecimal = results[@"foo"];
NSLog(@"fooAsDecimal: %@", [fooAsDecimal stringValue]);
// prints fooAsDecimal: 0.1
Ma poi ho ha trovato che chiamare stringValue
su un NSDecimalNumber
non stampa tutte le cifre significative in ogni caso, per esempio ..
NSDecimalNumber *barDecimal = [NSDecimalNumber decimalNumberWithString:@"0.1000000000000000000000000000000000000000000011"];
NSLog(@"barDecimal: %@", barDecimal);
// prints barDecimal: 0.1
... così la stampa 012.333.199.098.non mi dice se lo results[@"foo"]
sia stato arrotondato a un certo punto alla precisione finita dal parser JSON o meno.
essere chiaro, realizzo ho potuto utilizzare una stringa piuttosto che un numero nella rappresentazione JSON per memorizzare il valore di foo, cioè "0.1"
anziché 0.1
, e quindi utilizzare [NSDecimalNumber decimalNumberWithString:results[@"foo"]
]. Ma quello che mi interessa è come la classe NSJSONSerialization deserializzi i numeri JSON, quindi so se questo è veramente necessario o no.
Questo non è corretto. Il formato JSON non si preoccupa del float o della doppia precisione. È il parser JSON che perde la precisione. – Sulthan
@icodestuff: se eseguo il codice usando 'double dl = 8.92918e-128;', 'dict_back' è' nil'. Hai idea se esiste un modo per far sì che la deserializzazione JSON funzioni con tali valori usando 'NSJSONSerialization' o altre librerie? – sergio
Come ha detto Sulthan, a JSON non interessa la precisione. Se l'API di Apple segue le specifiche, dovrebbe utilizzare NSDecimalNumber. – xtravar