Czy NSJSONSerialization deserializuje liczby jako NSDecimalNumber?
Weź następujący fragment kodu:
NSError *error;
NSString *myJSONString = @"{ \"foo\" : 0.1}";
NSData *jsonData = [myJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
Moje pytanie brzmiresults[@"foo"]
NSDecimalNumber lub coś ze skończoną precyzją binarną, taką jak double lub float? Zasadniczo mam aplikację, która wymaga bezstratnej dokładności dostarczanej zNSDecimalNumber
i muszą upewnić się, że deserializacja JSON nie spowoduje zaokrąglenia z powodu podwójnej / pływakowej itd.
Na przykład. jeśli zostałoby to zinterpretowane jako float, napotkałbym na takie problemy z precyzją:
float baz = 0.1;
NSLog(@"baz: %.20f", baz);
// prints baz: 0.10000000149011611938
Próbowałem tłumaczyćfoo
jako NSDecimalNumber i wydruk wyniku:
NSDecimalNumber *fooAsDecimal = results[@"foo"];
NSLog(@"fooAsDecimal: %@", [fooAsDecimal stringValue]);
// prints fooAsDecimal: 0.1
Ale wtedy znalazłem to powołaniestringValue
naNSDecimalNumber
i tak nie drukuje wszystkich znaczących cyfr, np ...
NSDecimalNumber *barDecimal = [NSDecimalNumber decimalNumberWithString:@"0.1000000000000000000000000000000000000000000011"];
NSLog(@"barDecimal: %@", barDecimal);
// prints barDecimal: 0.1
... więc drukowaniefooAsDecimal
nie mówi mi, czyresults[@"foo"]
w pewnym momencie za pomocą parsera JSON zaokrąglono do skończonej precyzji.
Żeby było jasne, zdaję sobie sprawę, że mogę użyć ciągu zamiast liczby w reprezentacji JSON do przechowywania wartości foo, tj."0.1"
zamiast0.1
, a następnie użyj[NSDecimalNumber decimalNumberWithString:results[@"foo"]
]. Ale interesuje mnie to, w jaki sposób klasa NSJSONSerialization deserializuje numery JSON, więc wiem, czy jest to naprawdę konieczne, czy nie.