字符串我相信你正在運行到一個小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
NSDecimalNumber是NSNumber的子類。它應該響應任何沒有明確拒絕的NSNumber選擇器。 – Chuck 2011-03-08 07:11:24
我不知道但我試圖將dn的值更改爲其他值,但仍然是相同的結果。 – Robin 2011-03-08 07:20:03