python - 在 python 中,为什么 math.floor(4.9999999999999999) == 5?
问题描述
我知道这是一些浮点错误,但我读过 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
仅供参考 Pythonfloat
类型是IEEE 754 64 位 float,因此它可以(最多)有 2**64 个不同的值。十进制常量 4.9999999999999999 无法精确表示,因此在 Python 解析源代码时会四舍五入为其他值(恰好是 5.0 的精确表示)。没有引号,浮点数在转换为十进制之前会被四舍五入:
>>> import decimal
>>> decimal.Decimal(4.9999999999999999)
Decimal('5')
>>> decimal.Decimal('4.9999999999999999')
Decimal('4.9999999999999999')
推荐阅读
- reactjs - 将其存储在 useRef Hook 中并将可变值保存在 '.current' 属性中
- macos - 无法在 docker (mac) 中访问 jupyter notebook
- json - 循环 json 对象并用 React 显示数据?
- r - 如何将此邻接矩阵转换为图形对象?
- javascript - 重定向到主页
- django - Apache 上的 SMTPAuthenticationError 但标准服务器上没有。DJANGO 和 Apache2
- javascript - 绑定javascript后如何调用函数
- python - 该模型不适合 Tensorflow 和 GPU 的 Keras 错误
- bash - 如何在shell脚本中按函数对字符串数组进行排序
- javascript - 如何检索 yield 函数调用的值?