2016-10-01 70 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”),因为它可以精确地表示十进制数。十进制保留了给定的数字,因此给十进制的字符串可能对于人类输入更精确 –