你好!在 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,无论 num 和 div 的值如何。
奇怪的是,我发现了一个不成立的情况:num = 146097.0 和 div = 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 略小的值。// 然而,降低了内部值(value)。 Decimal 类型提供任意精度,因此您可以看到使用 365.2425 生成的近似值的效果:
>>> decimal.Decimal(365.2425)
Decimal('365.24250000000000682121026329696178436279296875')
>>> decimal.Decimal(146097) / decimal.Decimal(365.2425)
Decimal('399.9999999999999925296642496')
如果您使用字符串而不是浮点文字作为 Decimal 的参数,您将获得产生整数比 400 的有理分母。(Decimal code> 可以将字符串解析为一个精确的有理数,而不是从一个已经是近似值的浮点值开始。)
>>> decimal.Decimal(146097) / decimal.Decimal('365.2425')
Decimal('4E+2')
