2009-11-22 83 views
8
>>> float(str(0.65000000000000002)) 

0.65000000000000002 

>>> float(str(0.47000000000000003)) 

0.46999999999999997  ??? 

這是怎麼回事? 如何將0.47000000000000003轉換爲字符串並將結果值恢復爲浮點型?Python float - str - float怪異

我在Windows上使用Python 2.5.4。

+1

解決這個問題,加入IEEE-754標籤 – 2009-11-22 10:45:56

+3

RC:我認爲許多人(是的,程序員也)不知道IEEE 754定義了浮點數(不是每個人都閱讀語言規範:-))。所以我實際上認爲「浮點」標籤將是一個更好的選擇,除非有關標準本身的具體問題。 – Joey 2009-11-22 11:01:31

+5

當然,那些提出這些問題的人不知道ieee-754是什麼...... – sth 2009-11-22 11:30:26

回答

16

str(0.47000000000000003)給出'0.47'float('0.47')可以是0.46999999999999997。 這是由於被表現的方式浮點數(見本wikipedia文章)

注:float(repr(0.47000000000000003))eval(repr(0.47000000000000003))會給你預期的結果,但是如果你需要的精度,你應該使用Decimal

+0

謝謝,很高興知道! – Sharun 2009-11-22 10:59:49

+0

注意:在這裏使用小數不僅用於精度,還用於精確性。 – Joey 2009-11-22 11:02:10

+0

我不確定,但我認爲「精確」和「正確」是同義詞,精度是通常的術語。 – tzot 2009-12-12 23:31:02

3

float(和double)不具有無限精度。當然,在對它們進行操作時會發生舍入錯誤。

2

這是一個Python FAQ

同樣的問題出現quite regularly in comp.lang.python也。

我認爲這是一個常見問題的原因是,因爲python在所有其他方面都是完美的;我們期望它完美地執行算術 - 就像我們在學校教過的一樣。然而,任何已經完成數值方法課程的人都會告訴你,浮點數與完美的距離很遠。

Decimal是一個很好的選擇,如果你想更快的速度和更多的選擇gmpy是偉大的。

0

通過這個例子 我認爲當你devide

>>> print(int(((48/5.0)-9)*5)) 
    2 

簡單的方法,這是在Python中的錯誤,我這個

>>> print(int(round(((48/5.0)-9)*5,2))) 
    3