2011-03-08 99 views
3
NSDecimalNumber *dn = [[[NSDecimalNumber alloc] initWithString:@"9223372036854775806"] autorelease]; 
long long llVal = [dn longLongValue]; 

爲什麼llVal是-9223372036854775808?爲什麼[NSDecimalNumber longLongValue]返回最小值

NSDecimalNumber擴展了NSNumber,所以它假設處理long long類型。不是嗎?

回答

0

我認爲這是因爲longLongValue方法可以用於NSStringNSNumber而不是NSDecimalNumber

我不知道它是肯定的,但我認爲是原因的變量的值總是  -9223372036854775808即使你改變dn

+2

NSDecimalNumber是NSNumber的子類。它應該響應任何沒有明確拒絕的NSNumber選擇器。 – Chuck 2011-03-08 07:11:24

+0

我不知道但我試圖將dn的值更改爲其他值,但仍然是相同的結果。 – Robin 2011-03-08 07:20:03

4

字符串我相信你正在運行到一個小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

我通過[NSDecimalNumber stringValue]避免了這個問題,並調用strtoll()。 順便說一句,感謝確認 – teerapap 2011-03-08 05:44:04