在Python 2.7
和3.x
中,为什么整数除法在除以数字0 < x < 1
时会给出一个不正确的数字?
负数-1 < x < 0
甚至可以正常工作:
>>> 1//.1
9.0
>>> 1//-.1
-10.0
我理解带负数(或正数)的整数除法向负无穷大舍入,但我认为1//.1
应该导致10.0
,因为1
可以除以{ {1}}没有余数。
答案 0 :(得分: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