python 整数除法与 float < 1 产生奇怪的结果

Ior*_*nis 3 python

为了说明我的例子

尝试运行:

print(1//0.1)
print(1/0.1)
print(int(1/0.1))
Run Code Online (Sandbox Code Playgroud)

输出:

>>> print(1//0.1)
9.0
>>> print(1/0.1)
10.0
>>> print(int(1/0.1))
10
Run Code Online (Sandbox Code Playgroud)

的结果1//0.1既不是整数,也不正确。这同样适用于其他数字/测试用例。python 中的任何地方都记录了此行为吗?我找不到任何相关的东西。

a_g*_*est 7

其实就是__floordiv__按照数据模型来调用的。文档divmod提到了与以下内容的关系math.floor

[...] 对于浮点数,结果为(q, a % b),其中q通常为math.floor(a / b),但可能比该值小 1。无论如何都q * b + a % b非常接近a,[...]

因此,如果q, r = divmod(a, b)那么它成立q*b + r == a并且q == a//b

>>> a, b = 1, 0.1
>>> q, r = divmod(a, b)
>>> q*b + r == a
True
>>> a//b == q
True
Run Code Online (Sandbox Code Playgroud)

所以这里唯一的保证是q*b + r == a成立。


至于1.0 // 0.1产生 9.0,这是因为 FP 数字在内部以基数 2 表示,并且0.1不是“整数”数字,但实际上比“数学 0.1”大:

In [79]: f"{0.1:.20f}"
Out[79]: '0.10000000000000000555'
Run Code Online (Sandbox Code Playgroud)

  • @a_guest - 我编辑了文本,在你的优秀答案中添加了 0.1 发生的情况的示例 - 仅用这个片段添加另一个答案是不值得的,而且我认为它应该比评论更明显。请随意编辑回来/更改。 (3认同)