2010-02-12 71 views
3

可能重複:
Python float - str - float weirdness爲什麼在Python中劃分2/5.0時出現錯誤?

在蟒蛇,2/5.02/float(5)回報0.40000000000000002

爲什麼我得到這個錯誤在最後,我怎樣才能得到正確的值用於額外的計算?

+4

爲了您的細讀:*每個計算機科學家應該知道的關於浮點算術* http://docs.sun.com/source/806-3568/ncg_goldberg.html – 2010-02-12 09:52:31

+3

python教程解釋:http:// docs。 python.org/tutorial/floatingpoint.html – nosklo 2010-02-12 10:43:47

+0

重複的DOZENS問題。請搜索。所有這些:http://stackoverflow.com/search?q=[python]+floating+point。具體來說這個:http:// stackoverflow。com/questions/1778368/python-float-str-float-weirdness – 2010-02-12 11:36:23

回答

22

歡迎使用IEEE754,enjoy your stay

改爲使用decimal

+0

+1(鏈接到)對不幸事實的解釋。並且有用的解決方案。簡單地說。 – MattH 2010-02-12 09:47:50

+1

本節教程http://docs.python.org/tutorial/floatingpoint.html解釋了這個問題,python的方式 – nosklo 2010-02-12 10:43:30

+8

使用'decimal'而不是可怕的建議。十進制數字具有**相同的問題**(例如,如果您試圖表示2/3而不是2/5),但是'decimal.Decimal'與許多軟件包不兼容,速度慢,語法上處理更多麻煩。 – 2010-02-12 17:02:05

1

查看this question的解釋。正確的做法是要麼

  1. 使用整數,直到「最終」計算
  2. 直播與舍入誤差。
3

由於浮點運算不準確。您應該在您的額外計算中使用此值,並在完成後對結果進行四捨五入。如果您確切需要,請使用其他數據類型。

2

Ignacio上面有正確的答案。

IEEE標準有效地將浮點數存儲到二進制計算機中。這些細節非常詳細地介紹了數字的存儲方式,幾乎所有計算機都遵循這些規則。

他們也是錯的。二進制數字不能處理大多數正常數字,只是兩個冪。這些標準並沒有做一些棘手的事情,而是要求重新計算底部位數來實現四捨五入或其他技巧,這些標準選擇了效率。

這樣,您可以詛咒您的系統運行速度稍快。偶爾有關於以某種方式改變Python以解決這些問題的爭論,但是如果沒有效率的巨大損失,答案也不是微不足道的。

四處逛逛此:

一種選擇是挖掘到標準庫的「十進制」包。如果你堅持這些例子,並忽略長頁面,它會得到你想要的。沒有效率的賭注。

其次是做一個手動舍入和字符串截斷自己在一個輸出函數。如果你從不打印這些數字,那麼誰會關心這個數字是否有點偏離?

+4

使用'decimal'確實**沒有解決這個問題。十進制數字不能再比二進制浮點數字表示所有的有理數。只需從2/5更改示例並將其替換2/3即可。 – 2010-02-12 19:29:46

2

請注意,Python 3.1有一個新的浮點格式化函數,可以避免這種外觀。有關更多詳細信息,請參見What's new in Python 3.1(搜索「浮點」)。

相關問題