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
,无论 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 的比率略低。//
,但是,降低了内部价值。 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')
你好!在 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 的比率略低。//
,但是,降低了内部价值。 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')