2009-12-12 25 views
1

爲什麼0.1 + 0.1 + 0.1 - 0.3在Python中的計算結果爲 5.5511151231257827e-17基本Python數字!

+0

同意精密西港島線變化... 但這裏5.5511151231257827e-17是不正確! – 2009-12-12 11:27:21

+3

雖然不想從下面的答案中拿走任何東西,5.55e-17實際上是一個*小*數量,在大多數實際情況下將被視爲零。 – pavium 2009-12-12 11:27:48

+2

如果您不理解符號,您看到的數字表示0.000000000000000055511151231257827。很小。 – Artelius 2009-12-12 11:29:51

回答

15

因爲這就是浮點數的工作原理。如果您想要精確的數字,請使用decimal模塊。如果你想使用浮點數,你必須記住當你顯示它們時將它們舍入到一個特定的精度。

>>> print '%.2f' % (0.1+0.1+0.1-0.3,) 
0.00 
+1

正是......並且由於其他數字只被指定爲1位小數,所以您不能認真地期望在答案中顯示17位小數位。 – pavium 2009-12-12 11:35:11

+1

更確切地說,就是*二進制*浮點數的工作方式。由Python中的Decimal類型表示的數字是十進制浮點數。 – 2009-12-12 11:35:34

+0

是的,我可以更清楚。 「浮點數」我是指Python中的float類型。 – 2009-12-12 11:39:14

2

由於在計算機中表示浮點數的方式,這不僅僅是一個Python的東西。

+0

[報價] 類的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

+3

因爲'System.out.println'輪數,而這正是我在回答Python代碼一樣。 – 2009-12-12 11:44:40

7

這是一般浮點數的問題。有關說明,請參閱Wikipedia上的this section。粗略地說 - 有四捨五入的錯誤。請注意,您給我們的號碼非常小 - 約爲0.00000000000000005551115123。這裏是a more technical paper關於這個問題。

0

作爲一個例子,考慮代表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。

3

您可能有興趣瞭解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