爲什麼0.1 + 0.1 + 0.1 - 0.3
在Python中的計算結果爲 5.5511151231257827e-17
?基本Python數字!
回答
因爲這就是浮點數的工作原理。如果您想要精確的數字,請使用decimal
模塊。如果你想使用浮點數,你必須記住當你顯示它們時將它們舍入到一個特定的精度。
>>> print '%.2f' % (0.1+0.1+0.1-0.3,)
0.00
正是......並且由於其他數字只被指定爲1位小數,所以您不能認真地期望在答案中顯示17位小數位。 – pavium 2009-12-12 11:35:11
更確切地說,就是*二進制*浮點數的工作方式。由Python中的Decimal類型表示的數字是十進制浮點數。 – 2009-12-12 11:35:34
是的,我可以更清楚。 「浮點數」我是指Python中的float類型。 – 2009-12-12 11:39:14
由於在計算機中表示浮點數的方式,這不僅僅是一個Python的東西。
[報價] 類的Flt { \t公共靜態無效主要(字符串ARGS []) \t { \t \t浮子W,X,Y,Z,ANS; \t \t w = 0.1f; \t \t x = w; \t \t y = w; \t \t z = 0.3f; \t \t ans = w + x + y-z; \t \t System.out.println(ans); \t}} 了[/ quote] 在java中給出了0.0 – 2009-12-12 11:41:31
因爲'System.out.println'輪數,而這正是我在回答Python代碼一樣。 – 2009-12-12 11:44:40
這是一般浮點數的問題。有關說明,請參閱Wikipedia上的this section。粗略地說 - 有四捨五入的錯誤。請注意,您給我們的號碼非常小 - 約爲0.00000000000000005551115123。這裏是a more technical paper關於這個問題。
作爲一個例子,考慮代表1/3作爲科學若干基礎10.只有有限數量的數字(例如10),你會得舍入錯誤。說1/3≈0.3333333333e0。然後1/3 + 1/3 + 1/3(首先轉換爲十進制擴展後)表示爲0.9999999999e0,但1爲1.0e0。類似地,1/7≈0.1428571429e0和1/7 + 1/7將是0.2857142858e0,但是2/7的表示將是0.2857142857e0。在這兩種情況下,總和都是1e-10。
您可能有興趣瞭解Python 3通過更改repr
的工作方式改善了情況。現在會給你在最短的字符串表示將轉換回原來的浮動:
Python 3.1.1+ (r311:74480, Oct 11 2009, 20:19:13) [GCC 4.3.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 0.1 '0.1'
舊版本這樣的表現:
Python 2.6.4 (r264:75706, Oct 28 2009, 22:19:17) [GCC 4.3.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 0.1 '0.10000000000000001'
這僅僅是個repr
輸出(隱式調用時你在交互式解釋器中輸入一個值)。基本價值仍然是IEEE-754浮點數,他們仍然有一般限制條件:
Python 3.1.1+ (r311:74480, Oct 11 2009, 20:19:13) [GCC 4.3.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 0.1 0.1 >>> 0.2 0.2 >>> 0.3 0.3 >>> 0.1 + 0.2 0.30000000000000004 >>> 0.1 + 0.2 - 0.3 5.551115123125783e-17
- 1. Python的基本字符串數組
- 2. Python基本數學
- 3. 基本Python字典問題
- 4. 基本python字符串
- 5. 對齊整數(基本python)
- 6. Python基本函數程序
- 7. 基本的Python函數
- 8. Python類(基本)
- 9. 基本的python字符串格式。
- 10. 基本Python函數(數學參與)
- 11. SQL:SELECT數字文本基於數字
- 12. 計算數字階乘基數。 Python
- 13. 基本循環/ Python
- 14. Python - 基本編碼
- 15. 基本python編碼
- 16. 基本Python列表
- 17. 基本縮進 - Python
- 18. 基本python程序
- 19. Python中的字符串和整數的基本問題
- 20. 基本Python:將字符串作爲輸入傳遞給函數
- 21. 基本的Javascript數學文本字段
- 22. 基本程序生成隨機數Python
- 23. 基本的Python函數替換值
- 24. Python基本Q - 文件和數據
- 25. python構造函數基本問題
- 26. 使用基本Python函數的幫助
- 27. 使用Python的基本數據存儲
- 28. 基本幫助理解Python函數
- 29. Python:遞歸函數的基本案例
- 30. 基本的python用法,調用函數
同意精密西港島線變化... 但這裏5.5511151231257827e-17是不正確! – 2009-12-12 11:27:21
雖然不想從下面的答案中拿走任何東西,5.55e-17實際上是一個*小*數量,在大多數實際情況下將被視爲零。 – pavium 2009-12-12 11:27:48
如果您不理解符號,您看到的數字表示0.000000000000000055511151231257827。很小。 – Artelius 2009-12-12 11:29:51