Я обрабатываю большие 64-разрядные целые числа без знака из источника JSON, которые анализируются в NSDecimalNumbers, что, по-видимому, "верно представляет числа произвольной точности".
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить правильные цифры из этого класса. Например (используя наибольшее возможное значение):
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] unsignedLongLongValue]
= 0 // Incorrect
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775808"] unsignedLongLongValue]
= 9223372036854775808 // Correct
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775810"] unsignedLongLongValue]
= 9223372036854775808 // Incorrect
Похоже, что я не могу получить ничего большего, чем максимальное значащее долгое значение из NSDecimalNumber. Это не нравится значениям больше 9223372036854775808. Однако кажется, что число хранится в полной точности в NSDecimalNumber, как:
po [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] stringValue]
= 18446744073709551615
Я заметил, что объекты NSNumber могут обрабатывать эти большие числа, а unsignedLongLongValue работает правильно. Это просто NSDecimalNumbers (который я застрял), которые не работают.
Как я могу получить правильные значения unsigned long long из NSDecimalNumbers? Или, по крайней мере, преобразовать их в объекты NSNumber, где unsignedLongLongValue действительно работает.