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.1
und 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.