Python 除法:// 对比 math.floor

Python division: // vs math.floor

你好!在 python 中考虑以下内容:

import math

num = # Any float...
div = # Any float...

result_1 = math.floor(num / div)
result_2 = num // div

are_equal = result_1 == result_2
print(are_equal)

我听说 are_equal 应该总是 True,无论 numdiv 的值如何。

奇怪的是,我发现了一个不成立的案例:num = 146097.0div = 365.2425

这很奇怪吗?这样的例子很多吗?

为什么(146097.0 // 365.2425) == math.floor(146097.0 / 365.2425)

div 不完全是 365.2425;它是有理数 3652425/10000 的浮点数近似值。

>>> 365.2425.as_integer_ratio()
(6425414011327611, 17592186044416)  # Not (3652425, 10000) or (146097, 400)

因此,该比率并非恰好 400,而是比 / 四舍五入到 400 的比率略低。//,但是,降低了内部价值。 Decimal 类型提供任意精度,因此您可以看到使用 365.2425:

生成的近似值的效果
>>> decimal.Decimal(365.2425)
Decimal('365.24250000000000682121026329696178436279296875')
>>> decimal.Decimal(146097) / decimal.Decimal(365.2425)
Decimal('399.9999999999999925296642496')

如果您使用字符串而不是浮点文字作为 Decimal 的参数,您将得到产生整数比 400 的有理分母。(Decimal 可以解析字符串作为一个精确的有理数,而不是从一个已经是近似值的浮点值开始。)

>>> decimal.Decimal(146097) / decimal.Decimal('365.2425')
Decimal('4E+2')