NSJSONSerialization десериализует числа как NSDecimalNumber?

Возьмите следующий кусок кода:

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 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, поэтому я знаю, действительно ли это необходимо или нет.

Ответы на вопрос(4)

Ваш ответ на вопрос