在Python 2.7
和3.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
無餘數。
在Python 2.7
和3.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
無餘數。
你在這裏看到的實質上是使用/
的「正常」劃分和//
的地板劃分之間的差異的效果。
還有一點需要記住的是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',其中「**失敗**」和一個負數,結果是「-11.0」。 –
注意:'十進制(「1」)//十進制(「0.1」)給出十進制(「10」),因爲它可以精確地表示十進制數。十進制保留了給定的數字,因此給十進制的字符串可能對於人類輸入更精確 –
樓層分隔。看到這個帖子:http://stackoverflow.com/questions/5535206/negative-integer-division-surprising-result – Manhattan
地板(1/1.1)應該等於10雖然 –
可能的[另一產物是浮點運算破?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –