Deserialisiert NSJSONSerialization Zahlen als NSDecimalNumber?

Nehmen Sie den folgenden Code:

NSError *error;
NSString *myJSONString = @"{ \"foo\" : 0.1}";
NSData *jsonData = [myJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];

Meine Frage ist, istresults[@"foo"] eine NSDecimalNumber oder etwas mit endlicher binärer Genauigkeit wie ein Double oder Float? Grundsätzlich habe ich eine Anwendung, die die verlustfreie Genauigkeit erfordert, die mit einer kommtNSDecimalNumber, und müssen sicherstellen, dass die JSON-Deserialisierung nicht zu Rundungen aufgrund von Doubles / Floats usw. führt.

Z.B. Wenn es als Float interpretiert würde, stoße ich genau auf folgende Probleme:

float baz = 0.1;
NSLog(@"baz: %.20f", baz);
// prints baz: 0.10000000149011611938

Ich habe versucht zu dolmetschenfoo als NSDecimalNumber und Drucken des Ergebnisses:

NSDecimalNumber *fooAsDecimal = results[@"foo"];
NSLog(@"fooAsDecimal: %@", [fooAsDecimal stringValue]);
// prints fooAsDecimal: 0.1

Aber dann habe ich diese Berufung gefundenstringValue auf einemNSDecimalNumber druckt sowieso nicht alle signifikanten Ziffern, z. B. ...

NSDecimalNumber *barDecimal = [NSDecimalNumber decimalNumberWithString:@"0.1000000000000000000000000000000000000000000011"];
NSLog(@"barDecimal: %@", barDecimal);
// prints barDecimal: 0.1

... also druckenfooAsDecimal sagt mir nicht obresults[@"foo"] wurde irgendwann vom JSON-Parser auf endliche Genauigkeit gerundet oder nicht.

Um es klar auszudrücken, ist mir klar, dass ich eine Zeichenfolge anstelle einer Zahl in der JSON-Darstellung verwenden könnte, um den Wert von foo zu speichern, d. H."0.1" anstatt0.1und dann verwenden[NSDecimalNumber decimalNumberWithString:results[@"foo"]]. Mich interessiert jedoch, wie die NSJSONSerialization-Klasse JSON-Zahlen deserialisiert, sodass ich weiß, ob dies wirklich notwendig ist oder nicht.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage