Почему [NSDecimalNumber longLongValue] возвращает минимальное значение - PullRequest
3 голосов
/ 08 марта 2011
NSDecimalNumber *dn = [[[NSDecimalNumber alloc] initWithString:@"9223372036854775806"] autorelease];
long long llVal = [dn longLongValue]; 

почему llVal -9223372036854775808?

NSDecimalNumber расширяет NSNumber, поэтому предполагается, что он обрабатывает тип long long. не так ли?

Ответы [ 2 ]

4 голосов
/ 08 марта 2011

Я полагаю, вы столкнулись с небольшой ошибкой округления 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
0 голосов
/ 08 марта 2011

Я думаю, это потому, что метод longLongValue можно использовать при NSString и NSNumber, а не при NSDecimalNumber.

Я не знаю точно, но я думаю, что по этой причине значение вашей переменной всегда -9223372036854775808, даже если вы изменили строку на dn

...