Я считаю, что проблема в том, что вы используете метод 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
, показывающий как правильный результат извлечения десятичного числа, так и ошибку, которая возникает, когда это число временно сохраняется в двойном.