2011-11-22 103 views
2

可能重複:
Why can't decimal numbers be represented exactly in binary?精度雙Objective-C中的

當我輸入0.1作爲雙值,所述編譯器在它的末尾添加一個微小的值,是造成其他計算在我正在運行的程序中出錯。我的代碼只是說:

double temp = 0.1; 

而且我得到這個變量觀衆: http://img.skitch.com/20111122-nnrcgi4dtteg8aa3e8926r3fd4.jpg

有誰知道爲什麼發生這種情況?

由於

+0

重複許多許多問題;我選擇了一個,但如果有人能找到更好的,那也是一樣。 –

+0

一個有用的鏈接(但不是一個有用的答案):http://floating-point-gui.de/ – FogleBird

回答

11

double是浮動二進制點類型。在二進制中,「一半」的值是0.1,「四分之一」的值是0.01等。在有限二進制表示中,沒有任何方法可以完全代表「十分之一」代表十進制中的「三分之一」。編譯器正在爲您提供最接近的值,其值爲實際上要求的值。

如果您想精確地存儲十進制值,因爲您關心小數(例如對於當前值),您應該使用基於十進制的類型,如NSDecimalNumber或適當縮放的整數(例如,將15存儲爲15美分而不是0.15美元)。

我在.NET上binarydecimal浮點文章 - NSDecimalNumber在Objective-C是在C#中略有不同,decimal(請參閱文檔),但希望這些文章將會給你多一點見識到了什麼是真正發生。

編輯:如註釋中所述,通常十進制浮點類型明顯比二進制浮點類型慢,部分原因是它們通常較大,部分原因是它們沒有CPU支持。如果你有一個硬性能要求你想要精確保留數字,「整數和隱含的比例」選項通常是一個好的選擇,儘管編碼很麻煩,因爲每次閱讀時需要考慮它代碼:)

+0

是的,有。它是NSDecimalNumber類。 –

+0

@LuizCarlosQuerinoFilho:謝謝,我會做相應的調整。 –

+1

很高興在目標C帖子上看到J.Skeet,一如既往的完美答案,只是希望強調NSDecimalNumber相比於C double的性能缺陷,如果需要大量操作的話。 – jbat100