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