Возьмите следующий фрагмент кода:
NSError *error;
NSString *myJSONString = @"{ \"foo\" : 0.1}";
NSData *jsonData = [myJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
Мой вопрос в том, является ли results[@"foo"]
NSDecimalNumber или что-то с конечной двоичной точностью, такой как double или float? В принципе, у меня есть приложение, для которого требуется точность без потерь, которая поставляется с NSDecimalNumber
, и необходимо убедиться, что десериализация JSON не приводит к округлению из-за удвоения /float и т.д.
например. если он был интерпретирован как float, я бы столкнулся с такими проблемами:
float baz = 0.1;
NSLog(@"baz: %.20f", baz);
// prints baz: 0.10000000149011611938
Я пробовал интерпретировать foo
как NSDecimalNumber и печатать результат:
NSDecimalNumber *fooAsDecimal = results[@"foo"];
NSLog(@"fooAsDecimal: %@", [fooAsDecimal stringValue]);
// prints fooAsDecimal: 0.1
Но потом я обнаружил, что вызов stringValue
на NSDecimalNumber
не печатает все значимые цифры в любом случае, например...
NSDecimalNumber *barDecimal = [NSDecimalNumber decimalNumberWithString:@"0.1000000000000000000000000000000000000000000011"];
NSLog(@"barDecimal: %@", barDecimal);
// prints barDecimal: 0.1
... поэтому печать fooAsDecimal
не говорит мне, был ли results[@"foo"]
в какой-то момент округлен до конечной точности парсером JSON или нет.
Чтобы быть ясным, я понимаю, что в представлении JSON можно использовать строку, а не число, чтобы сохранить значение foo, т.е. "0.1"
вместо 0.1
, а затем использовать [NSDecimalNumber decimalNumberWithString:results[@"foo"]
]. Но меня интересует, как класс NSJSONSerialization десериализует номера JSON, поэтому я знаю, действительно ли это необходимо или нет.