2010-07-21 40 views

回答

2

我認爲,問題是,你正在使用的NSNumber的-longLongValue上NSDecimalNumber方法。 NSDecimalNumber在內部以十進制形式存儲數字的高精度表示,但NSNumber只是將其保留爲IEEE 754雙精度浮點值。如果我沒有記錯,如果在NSDecimalNumber上使用標準NSNumber超類方法,則內部數字首先會轉換爲double,這會導致像這樣的二進制浮點假象。

正如neoneye所說,解決這個問題的方法可能是使用NSString作爲中介。例如:

NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString :@"11111111111111111"]; 
double number2 = [@"11111111111111111" doubleValue]; 

NSLog(@"%@ = %lld = %f", number, [[number descriptionWithLocale:nil] longLongValue], number2); 

將產生結果11111111111111111 = 11111111111111111 = 11111111111111112.000000,表示既從十進制數提取了正確的結果,並且當該數目被臨時存儲在一個雙這種情況發生的錯誤。 「

+0

」如果我正確地記得,如果您在NSDecimalNumber上使用標準NSNumber超類方法,則內部編號首先會轉換爲雙精度浮點數,這會引入像這樣的浮點僞像「 您從哪裏得到這些信息?這聽起來很奇怪,我幾乎不相信它。在大多數情況下,我們通過NSNumber接口來處理實例,我們不應該考慮使用哪個具體的子類來構造這個實例。 – iKiR 2010-07-21 15:09:16

+0

@iKiR - 這裏有一些討論:http://stackoverflow.com/questions/2479100/cocoa-ive-discovered-what-i-think-is-a-bug-with-nsdecimalnumber,它指向馬庫斯的評論這裏:http://www.cimgf.com/2008/04/23/cocoa-tutorial-dont-be-lazy-with-nsdecimalnumber-like-me/,但那並不完全說明這種情況。當我遇到類似的問題時,它可能已經在我找到的cocoa-dev郵件列表存檔中的某處。是的,這很奇怪,我想我當時提交了一份錯誤報告。我建議你自己提交一份。 – 2010-07-21 16:45:45

+0

感謝Brad,幾分鐘前我提交了一個bug:https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/3/wo/Stnn5Aaocknzx52c64zbN0/5.83.28.0.9 – iKiR 2010-07-22 03:43:23