为了说明我的例子
尝试运行:
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 中的任何地方都记录了此行为吗?我找不到任何相关的东西。
其实就是__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)