在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) –