2011-07-15 128 views
14

我正在處理來自JSON源的大型64位無符號整數,這些JSON源被解析爲NSDecimalNumbers,這顯然是「忠實地表示任意精度數字」。NSDecimalNumber和大的無符號long long(64位)整數

我遇到的問題是我不能從這個類中得到正確的數字。例如(使用最大可能值):

print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] unsignedLongLongValue] 
= 0 // Incorrect 
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775808"] unsignedLongLongValue] 
= 9223372036854775808 // Correct 
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775810"] unsignedLongLongValue] 
= 9223372036854775808 // Incorrect 

這樣看來,我不能得到任何比符號long long值出NSDecimalNumber的最大大。但是似乎號被存儲在一個NSDecimalNumber內全精度它不喜歡比9223372036854775808.較大的值,如:

po [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] stringValue] 
= 18446744073709551615 

我注意到,NSNumber的對象可以處理這些大量的罰款和unsignedLongLongValue作品正確。這只是NSDecimalNumbers(我堅持)哪些不起作用。

如何從NSDecimalNumbers中得到正確的無符號long long值?或者至少將它們轉換爲unsignedLongLongValue工作的NSNumber對象。

回答

11

我已經從蘋果公司在這個問題上通過開發者論壇的迴應:

這是一個存在的問題與NSDecimalNumber在簡單 存取(如[無符號] longLongValue)經過的doubleValue 存取器 - 這個任何值需要超過53位的精度 將被不適當地四捨五入。隨意舉報這個 問題的Bug和提bug數8220543.

也就是說,如果你是從JSON只是 得到的64位數字,你應該能夠只使用 NSNumber的,而不是NSDecimalNumber。

所以我從SBJson改變解析器JSONKit,這不僅是更快的解決它,它也映射到數字對象的NSNumber,而不是NSDecimalNumber對象。

+1

我不知道問題是否在iOS 5中的NSJSONSerialization類仍然存在不正確的值? – adib

+0

我沒有意識到這一點在iOS 5中,我會檢查出來 - 謝謝! –

+0

它完全堅持在iOS 5的NSJSONSerialization! o_O –

6

如果你仍然想提取從NSDecimalNumber一個unsigned long long值,你可以使用由強尼here建議的方法,並做類似如下:

NSDecimalNumber *testNumber = [NSDecimalNumber decimalNumberWithString:@"18446744073709551615"]; 
unsigned long long ullvalue = strtoull([[testNumber stringValue] UTF8String], NULL, 0); 
NSLog(@"Number:%llu", ullvalue); 

產生的

正確的結果

編號:18446744073709551615

我嘗試使用NSScanner做到這一點:

NSScanner *theScanner = [[NSScanner alloc] initWithString:[testNumber stringValue]]; 
unsigned long long outputValue; 

[theScanner scanLongLong:(long long *)&outputValue]; 
[theScanner release]; 

但不幸的是,它只能讀取符號long long值,所以上面給出了9223372036854775807

+0

感謝您的建議,如果你困在NSDecimalNumbers! –