Я полагаю, вы столкнулись с небольшой ошибкой округления base10-> base2 в -longLong
. Я бы открыл дефект на bugreport.apple.com. Вы должны быть в состоянии совершить круговую передачу числа в пределах дальнего радиуса действия.
Если вы остаетесь полностью в NSDecimalNumber
, вы заметите, что в нем нет ошибки округления. Вот некоторый код, который, я думаю, очень ясно показывает проблему:
unsigned long long longlong = 9223372036854775806;
NSLog(@"longlong: %lu", longlong);
NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithMantissa:longlong exponent:0 isNegative:NO];
NSLog(@"dn-dn: %@", dn); // Round-trips fine
NSLog(@"dn+10: %@", [dn decimalNumberByAdding:[NSDecimalNumber decimalNumberWithString:@"10"]]); // Even does math
NSLog(@"dn-lu: %lu", [dn unsignedLongValue]); // has rounding error
2011-03-07 23:56:15.132 Untitled[16059:a0f] longlong: 9223372036854775806
2011-03-07 23:56:15.135 Untitled[16059:a0f] dn-dn: 9223372036854775806
2011-03-07 23:56:15.135 Untitled[16059:a0f] dn+10: 9223372036854775816
2011-03-07 23:56:15.136 Untitled[16059:a0f] dn-lu: 9223372036854775808