2010-05-21 110 views
1
>>> num = 4.123456 
>>> round(num, 3) # expecting 4.123 
4.1230000000000002 

我期待4.123因此,我錯了嗎?Python四捨五入問題

+0

*(相關)* http://stackoverflow.com/questions/56820/round-in-python-doesnt-seem-to-be-rounding-properly – 2010-05-21 08:35:19

+0

也非常相關:http://stackoverflow.com/ question/1089018/why-cant-decimal-numbers-be-represent-exactly-in-binary – Joren 2010-05-21 08:42:05

+1

這是一個常見問題解答: http://www.python.org/doc/faq/general/#why-are-floating - 點計算 - 因此不準確 – dan04 2010-05-24 23:38:29

回答

2

如果你想有一個確切浮點數的表示,你必須使用decimal

+4

十進制通常不會比二進制浮點更精確。它可以精確地代表*小數*分數(直到一個點),這當然是數據類型的整個點,但它也有其侷限性。 – Joren 2010-05-21 08:39:41

+3

'decimal.Decimal'具有表示和舍入錯誤,就像'float'一樣,儘管您可以通過其他方式控制它們。我還沒有看到某個人的浮點不精確問題有使用'Decimal'的最佳解決方案。 「小數」在利基金融應用中非常有用。 – 2010-05-21 08:43:20

+0

@Joren:*與二進制浮點的內置浮點實現相比,新類特別適用於需要**精確十進制表示的財務應用程序和其他用途**,對精度的控制,對四捨五入的控制以符合法律或監管要求,跟蹤重要的小數位,或者用戶期望結果與手工計算結果相匹配的應用。* [本書](http://www.network-theory.co.uk/docs/pytut) /DecimalFloatingPointArithmetic.html)。也許我的回答不好,但這就是我的意思。 – 2010-05-21 08:47:23

6

是的,你的預期不匹配您的工具的設計意圖。

查看this section的Python教程。


使用math.round其實很少見。如果你想顯示一個數字作爲一個字符串到一定的精確度,你可能想要的東西更像

>>> num = 4.123456 
>>> print "%.3f" % num 
4.123 

你可能有興趣在string formatting的文件中。

+1

我找到了過度鏈接的canon浮點頁面。您在Python文檔中提供的鏈接方式更實用,並且在大多數人可以理解和欣賞的級別上。 – 2010-05-21 08:41:12

+0

兩者都是寶貴的資源。我同意這篇文章對初學者更好,但最終人們也希望閱讀Goldberg的文章。 – Joren 2010-05-21 08:46:56

+0

謝謝。但我只想把它看作一個數字,而不是字符串。 – pocoa 2010-05-21 08:57:16

4

你爲什麼在意? (這是一個嚴重的問題。)

你得到的答案是如此接近4.123,因爲沒有區別。它不可能完全是4.123,因爲Python只能有限地表示很多數字(典型機器上大約有2**64),並且沒有詳細描述浮點表示,所以4.123不是一個這些數字。順便說一句,4.1230000000000002不是可以準確表示的數字之一;實際存儲的數字是4.12300000000000022026824808563105762004852294921875,但爲了顯示目的,Python將十進制表示截斷爲17位有效數字。所以:

  1. 如果你正在做數學與結果,那麼4.123,你在說什麼之間的差異是如此的渺小,以使沒有真正的區別。你別擔心。
  2. 如果你只是關心輸出看起來漂亮(即你在這裏後是一個字符串而不是數字),那麼使用str或字符串格式。
  3. 如果差異確實很重要,例如,因爲您正在從事財務工作,並且這會影響稍後輪換的方向,請使用decimal模塊。

最後說明一點:在Python 3.X和Python 2.7,一個浮動的repr已經改變,讓你真正能拿到4.123如你期望在這裏。

+1

+1,「如果你用結果做數學,那麼'4.123'和你得到的東西之間的差別非常小,以至於沒有真正的區別。」 <---確切地說 – 2010-05-21 09:15:22

+0

是的,你是對的。謝謝你們讓我理解/記住這一點。 – pocoa 2010-05-21 10:52:01