2015-06-23 95 views
1

當我將NSNumber轉換爲NSDecimalNumber時,此轉換通常不是真實的。NSNumber到NSDecimalNumber轉換問題

我有一些像92.43,當我轉換這個值以十進制或雙 [數字decimalValue]或[數字的doubleValue]值變化92.4299999999 ..

我不喜歡[NSDecimalNumber decimalNumberWithDecimal這麼多的事情:數字decimalValue]它總是返回「92.429999」到這個數字。

如何使用NSNumber originalValue十進制或雙精度無關緊要我想將「92.43」這個數字用作「92.43」。爲什麼這個價值在變化?

+1

這個問題在其他語言中也很常見 - 儘管電腦嘗試了,但它們並不完美(不幸的是,對於我們人類來說:P)。一個簡單的解決方法是將十進制數轉換爲十進制數 –

+0

[可能出現[Rounding Float]的Objective C問題](http://stackoverflow.com/questions/6333711/objective-c-issue-with-rounding-float) –

+0

謝謝頰。在四捨五入後加上或乘以兩個十進制值。但我想知道爲什麼這個值會改變,你說的常見問題:)我得到我的答案,謝謝。你知不知道如何獲得原始價值而不是四捨五入。 – zapdroid

回答

-2

如果你只需要打印該號碼,然後嘗試:

NSLog(@"%.2f", decimalNumber); 

這將92.4299999999圓..兩個小數和結果將是:

92.43

+0

我不想精確。這個價值只是我的問題的一個例子。該值可以是92.4878。 – zapdroid

2

這是爲什麼發生?

一個簡單的解釋是,它與計算機如何執行計算以及如何表示浮點數有關。大多數浮點數並沒有足夠精確的表示,因爲它們需要無限數量的數字來表示,因此舍入(也稱爲舍入或舍入誤差)。

你能做什麼?

如果你真的需要進行精確的計算(計算例如價格),你不應該NSNumber在所有的工作,但使用NSDecimalNumber一路,並將其用於所有的計算。最安全的方法是從字符串創建它,例如:

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:@"92.34567891"]; 

如果準確性不要緊,你可以送花兒給人的結果格式化爲一個固定的小數位數。在這種情況下,您可能還想查看NSDecimalNumberHandler來定義舍入行爲。