提问人:Ekanshdeep Gupta 提问时间:5/30/2020 最后编辑:Ch3steREkanshdeep Gupta 更新时间:5/30/2020 访问量:231
在python中,为什么math.floor(4.9999999999999999)==5?
In python, why does math.floor(4.9999999999999999) == 5?
问:
我知道这是一些浮点错误,但我读过 python 具有无限的精度,所以这种事情不应该发生。
自包含的可运行代码:
import math
math.floor(4.9999999999999999)
答:
11赞
pts
5/30/2020
#1
它被四舍五入到调用之前。5.0
math.floor
>>> 4.9999999999999999 == 5.0
True
>>> import math
>>> math.floor(5.0)
5.0
获得正确行为的一种方法是使用(而不是使用或根本不使用):Decimal
float
math
>>> 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
评论
float
int
math.sqrt
b = 36028797018963970 ** 2; math.floor(math.sqrt(b - 1)) == math.sqrt(b - 1)