Skip to main content
 首页 » 编程设计

Python 师 ://vs math. 楼

2025年05月04日18小虾米

你好!在 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')