在python中,为什么math.floor(4.9999999999999999)==5?

In python, why does math.floor(4.9999999999999999) == 5?

提问人:Ekanshdeep Gupta 提问时间:5/30/2020 最后编辑:Ch3steREkanshdeep Gupta 更新时间:5/30/2020 访问量:231

问:

我知道这是一些浮点错误,但我读过 python 具有无限的精度,所以这种事情不应该发生。

自包含的可运行代码:

import math
math.floor(4.9999999999999999)
python-3.x 浮动精度

评论

9赞 khelwood 5/30/2020
Python 当然没有无限的精度。float
5赞 Thierry Lathuille 5/30/2020
...你读到的是关于.int
0赞 pts 5/30/2020
同样,不要用于检查大整数是否为完美平方:浮点四舍五入会给你误报:是真的。math.sqrtb = 36028797018963970 ** 2; math.floor(math.sqrt(b - 1)) == math.sqrt(b - 1)

答:

11赞 pts 5/30/2020 #1

它被四舍五入到调用之前。5.0math.floor

>>> 4.9999999999999999 == 5.0
True
>>> import math
>>> math.floor(5.0)
5.0

获得正确行为的一种方法是使用(而不是使用或根本不使用):Decimalfloatmath

>>> import decimal
>>> int(decimal.Decimal('4.99999999999999999999999999999999999999999999999999999999999999999999999'
).to_integral(rounding=decimal.ROUND_DOWN))
4

仅供参考 Python 类型是 IEEE 754 64 位浮点数,因此它最多可以有 2**64 个不同的值。十进制常量 4.99999999999999999 不能精确表示,因此当 Python 解析源代码时,它会四舍五入到其他值(恰好是 5.0 的确切表示)。如果没有引号,浮点数在转换为十进制之前会四舍五入:float

>>> import decimal
>>> decimal.Decimal(4.9999999999999999)
Decimal('5')
>>> decimal.Decimal('4.9999999999999999')
Decimal('4.9999999999999999')

评论

1赞 Ekanshdeep Gupta 5/30/2020
有没有办法让我像预期的那样工作?也许使用 Decimal 或其他一些库?
1赞 pts 5/30/2020
@EkanshdeepGupta:是的,有效,请看我更新的答案。Decimal