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

标签 python python-3.x precision floating-accuracy

我知道这是一些浮点错误,但我读过 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 (并且根本不使用 floatmath):
>>> import decimal
>>> int(decimal.Decimal('4.99999999999999999999999999999999999999999999999999999999999999999999999'
).to_integral(rounding=decimal.ROUND_DOWN))
4

仅供引用 Python float类型是 IEEE 754 64-bit float ,因此它可以有(最多)2**64 个不同的值。十进制常量 4.9999999999999999 无法精确表示,因此在 Python 解析源代码时将其四舍五入为其他值(恰好是 5.0 的精确表示)。没有引号,浮点数在转换为十进制之前四舍五入:
>>> import decimal
>>> decimal.Decimal(4.9999999999999999)
Decimal('5')
>>> decimal.Decimal('4.9999999999999999')
Decimal('4.9999999999999999')

关于python - 在 python 中,为什么 math.floor(4.9999999999999999) == 5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62103402/

相关文章:

python - 如何直接查询Django为ManyToMany关系创建的表?

Python x509 get_serial_number() 返回不正确的值

SQLite3 Python - 检查条目是否存在

Javafx double 变量,具有两位小数

python - 对 Python 中的 readline() 返回感到困惑

python-3.x - 按截止时间分组观察

python 3.3 : struct. pack 不接受字符串

perl - 如何在 Perl 中强制 long double

floating-point - 为什么 float 不正确?

python - 将 python 类导入包中的另一个文件夹