Python部门:// vs math.floor

Ger*_*ica 1 python rounding division

你好!考虑一下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)
Run Code Online (Sandbox Code Playgroud)

我听说,无论and 的值are_equal如何True,都应该如此。numdiv

奇怪的是,我发现这种情况不成立:num = 146097.0div = 365.2425

这令人惊讶吗?有很多这样的例子吗?

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

che*_*ner 5

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

>>> 365.2425.as_integer_ratio()
(6425414011327611, 17592186044416)  # Not (3652425, 10000) or (146097, 400)
Run Code Online (Sandbox Code Playgroud)

结果,该比率并非精确地为 400,但略微/接近四舍五入就变成了400 //。该Decimal类型提供任意精度,因此您可以看到使用由生成的近似值的效果365.2425

>>> decimal.Decimal(365.2425)
Decimal('365.24250000000000682121026329696178436279296875')
>>> decimal.Decimal(146097) / decimal.Decimal(365.2425)
Decimal('399.9999999999999925296642496')
Run Code Online (Sandbox Code Playgroud)

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

>>> decimal.Decimal(146097) / decimal.Decimal('365.2425')
Decimal('4E+2')
Run Code Online (Sandbox Code Playgroud)