Цель C странное десятичное в длинное длинное преобразование - PullRequest
6 голосов
/ 05 января 2012
NSLog(@"%llu\n\n", ULONG_LONG_MAX);

NSDecimalNumber *decimal = [NSDecimalNumber decimalNumberWithString:@"154550038129946620"];
NSLog(@"%@", decimal);
NSLog(@"%llu\n\n", [decimal unsignedLongLongValue]);

decimal = [NSDecimalNumber decimalNumberWithString:@"154550038129946628"];
NSLog(@"%@", decimal);
NSLog(@"%llu", [decimal unsignedLongLongValue]);

Оба значения меньше, чем ULONG_LONG_MAX. Но то, что мы видим в выводе:

2012-01-05 17:41:55.879 test[1276:207] 18446744073709551615

2012-01-05 17:41:55.969 test[1276:207] 154550038129946620
2012-01-05 17:41:56.095 test[1276:207] 154550038129946624

2012-01-05 17:41:56.096 test[1276:207] 154550038129946628
2012-01-05 17:41:56.096 test[1276:207] 154550038129946624

Что я делаю не так? Я понятия не имею, как объяснить это поведение.

1 Ответ

5 голосов
/ 05 января 2012
В

NSDecimalNumber отсутствует метод unsignedLongLongValue, поэтому он наследует реализацию по умолчанию от NSNumber. Единственный способ получить значение NSDecimalNumber - получить структуру NSDecimal или double. Ошибка преобразования вносится в процессе преобразования NSDecimalNumber в double.

...