2016-10-01 67 views
13

在Python 2.73.x,爲什麼整數除法給我一個不正確的數字除以數字0 < x < 1爲什麼1 // 0.1 == 9.0?

負數-1 < x < 0甚至正常工作:

>>> 1//.1 
9.0 
>>> 1//-.1 
-10.0 

據我所知,整數除法與負(或正)數輪向負無窮大,但是我還以爲1//.1應導致10.0因爲1可除以.1無餘數。

+4

樓層分隔。看到這個帖子:http://stackoverflow.com/questions/5535206/negative-integer-division-surprising-result – Manhattan

+3

地板(1/1.1)應該等於10雖然 –

+6

可能的[另一產物是浮點運算破?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

回答

26

你在這裏看到的實質上是使用/的「正常」劃分和//的地板劃分之間的差異的效果。

還有一點需要記住的是general issue with floating point arithmetic,這只是因爲它們的工作方式而存在一定的不精確性。在這些情況下,使用decimal模塊檢查實際情況總是很好的。因此,讓我們看看,你在這裏做:

首先,.1已經是不準確的:

>>> Decimal(.1) 
Decimal('0.1000000000000000055511151231257827021181583404541015625') 

那麼,讓我們來看看各分部的實際結果:

>>> Decimal(1)/Decimal(.1) 
Decimal('9.999999999999999444888487687') 
>>> 1/.1 
10.0 

正如你所看到的,使用/的正常劃分並不完全給你10浮點運算。但它非常接近。這就是爲什麼當你使用正常的浮標時,你實際上會返回10(因爲在不精確的數字類型中分割不準確會立即丟失)。

當使用地板事業部,結果被難倒不精確校正之前,所以這就是爲什麼你9

>>> Decimal(1) // Decimal(.1) 
Decimal('9') 
>>> 1/.1 
10.0 

負數,地板的效果是相反的方向,作爲解釋in that other question

>>> Decimal(1)/Decimal(-.1) 
Decimal('-9.999999999999999444888487687') 
>>> 1/-.1 
-10.0 
>>> Decimal(1) // Decimal(-.1) 
Decimal('-9') 
>>> 1 // -.1 
-10.0 
+3

另一個很好的例子是'3 // -.3',其中「**失敗**」和一個負數,結果是「-11.0」。 –

+0

注意:'十進制(「1」)//十進制(「0.1」)給出十進制(「10」),因爲它可以精確地表示十進制數。十進制保留了給定的數字,因此給十進制的字符串可能對於人類輸入更精確 –