为什么[NSDecimalNumber longLongValue]返回最小值

时间:2011-03-08 04:07:15

标签: objective-c cocoa nsnumber

NSDecimalNumber *dn = [[[NSDecimalNumber alloc] initWithString:@"9223372036854775806"] autorelease];
long long llVal = [dn longLongValue]; 

为什么llVal是-9223372036854775808?

NSDecimalNumber扩展了NSNumber,因此它假设处理long long类型。不是吗?

2 个答案:

答案 0 :(得分:4)

我相信您在-longLong中遇到了一个小的base10-> base2舍入错误。我会在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

答案 1 :(得分:0)

我认为这是因为longLongValue方法可以在NSStringNSNumber而不是NSDecimalNumber上使用。

我当然不知道,但我认为即使您更改了-9223372036854775808

上的字符串,您变量的值始终为dn的原因也是如此