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

问题描述 投票:1回答:1

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

自带可运行的代码。

import math
math.floor(4.9999999999999999)
python python-3.x precision floating-accuracy
1个回答
11
投票

它的四舍五入是 5.0 之前 math.floor 被称为。

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

获得正确行为的一种方法是使用 Decimal (而不是用 floatmath 在所有)。)

>>> 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')
© www.soinside.com 2019 - 2024. All rights reserved.