我知道这是一些浮点错误,但我曾读到python有无限精度,所以这种事情不应该发生。
自带可运行的代码。
import math
math.floor(4.9999999999999999)
它的四舍五入是 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 float
类型是 IEEE 754 64位浮点数因此它可以有 (最多) 2**64 个不同的值。十进制常数4.9999999999999999不能被精确表示,所以当Python解析源代码时,它被四舍五入到其他值(恰好是5.0的精确表示)。如果不加引号,浮点数在转换为十进制之前就被四舍五入了。
>>> import decimal
>>> decimal.Decimal(4.9999999999999999)
Decimal('5')
>>> decimal.Decimal('4.9999999999999999')
Decimal('4.9999999999999999')