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 zNSDecimalNumberi 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.

questionAnswers(4)

yourAnswerToTheQuestion