NSDecimalNumber to unsignedLongLong - неправильное значение - PullRequest
0 голосов
/ 21 июля 2010

Вот код:

NSNumber* number = [NSDecimalNumber decimalNumberWithString :@"11111111111111111"];
NSLog(@"%@ = %lld", number, [number unsignedLongLongValue]);

И я получаю вывод:

11111111111111111 = 11111111111111112

Это известная ошибка или я что-то не так делаю?

ОБНОВЛЕНИЕ: Сообщение об ошибке: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/3/wo/Stnn5Aaocknzx52c64zbN0/5.83.28.0.9

1 Ответ

2 голосов
/ 21 июля 2010

Я считаю, что проблема в том, что вы используете метод NSNumber -longLongValue для NSDecimalNumber.NSDecimalNumber хранит высокоточное представление числа внутри себя как десятичное число, но NSNumber просто сохраняет его как значение с плавающей точкой двойной точности IEEE 754.Если я правильно помню, если вы используете стандартные методы суперкласса NSNumber для NSDecimalNumber, внутреннее число сначала преобразуется в двойное, что может привести к двоичным артефактам с плавающей запятой, подобным этому.вокруг этого может быть использование NSString в качестве посредника.Например:

NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString :@"11111111111111111"];
double number2 = [@"11111111111111111" doubleValue];

NSLog(@"%@ = %lld = %f", number, [[number descriptionWithLocale:nil] longLongValue], number2);

Будет выдан результат 11111111111111111 = 11111111111111111 = 11111111111111112.000000, показывающий как правильный результат извлечения десятичного числа, так и ошибку, которая возникает, когда это число временно сохраняется в двойном.

...