Nehmen Sie das folgende Stück Code:Sortiert NSJSONSerialization Nummern als NSDecimalNumber?
NSError *error;
NSString *myJSONString = @"{ \"foo\" : 0.1}";
NSData *jsonData = [myJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
Meine Frage ist, ist results[@"foo"]
ein NSDecimalNumber, oder etwas mit endlicher binärer Präzision wie ein Doppel- oder schwimmen? Im Grunde habe ich eine Anwendung, die die verlustfreie Genauigkeit erfordert, die mit einer NSDecimalNumber
kommt, und muss sicherstellen, dass die JSON-Deserialisierung nicht zu Rundungen aufgrund von Doubles/Floats usw. führt.
z. wenn es als Schwimmer interpretiert wurde, würde ich in Probleme wie diese mit Präzision auszuführen:
float baz = 0.1;
NSLog(@"baz: %.20f", baz);
// prints baz: 0.10000000149011611938
Ich habe versucht, foo
als NSDecimalNumber zu interpretieren und das Drucken des Sende:
NSDecimalNumber *fooAsDecimal = results[@"foo"];
NSLog(@"fooAsDecimal: %@", [fooAsDecimal stringValue]);
// prints fooAsDecimal: 0.1
Aber dann habe ich festgestellt, dass alle signifikanten Stellen druckt nicht ohnehin auf einem NSDecimalNumber
stringValue
Aufruf, zB ..
NSDecimalNumber *barDecimal = [NSDecimalNumber decimalNumberWithString:@"0.1000000000000000000000000000000000000000000011"];
NSLog(@"barDecimal: %@", barDecimal);
// prints barDecimal: 0.1
... soDrucksagt mir nicht, ob results[@"foo"]
zu irgendeinem Zeitpunkt durch den JSON-Parser auf endliche Genauigkeit gerundet wurde oder nicht.
klar sein, wird mir klar, ich eher einen String verwenden könnte als eine Zahl in Vertretung der JSON den Wert von foo zu speichern, das heißt "0.1"
statt 0.1
, und verwenden Sie dann [NSDecimalNumber decimalNumberWithString:results[@"foo"]
]. Aber was mich interessiert ist, wie die NSJSONSerialization-Klasse JSON-Nummern deserialisiert, damit ich weiß, ob das wirklich notwendig ist oder nicht.
Dies ist falsch. Das JSON-Format interessiert sich nicht für Float oder Double Precision. Es ist der JSON-Parser, der die Präzision verliert. – Sulthan
@icodestuff: Wenn ich Ihren Code mit 'double dl = 8.92918e-128;' verwende, ist 'dict_back'' nil'. Haben Sie eine Idee, ob es eine Möglichkeit gibt, JSON-Deserialisierung für solche Werte mit 'NSJSONSerialization' oder anderen Bibliotheken zu verwenden? – sergio
Wie Sulthan sagte, kümmert sich JSON nicht um Präzision. Wenn Apples API den Spezifikationen entspricht, sollte NSDecimalNumber verwendet werden. – xtravar