Python 关于舍入的奇怪行为

标签 python python-2.7 floating-point rounding-error

问题很简单,为什么会这样:

>>> (2**32-1)**2 - 4.0**2 - (2**32-1)**2
0.0
>>> (2**32-1)**2 - (2**32-1)**2 - 4.0**2
-16.0

我知道这一定是关于 float 舍入错误的,但我需要一个正式的解释,以及我们如何避免这种错误?

P/s:我使用的是 python 2.7.3,MacOSX,64 位

最佳答案

Python int 类型可以轻松地超过您的平台字长,但浮点值与硬件相关。不要混用 long int 和浮点值。

在您的第一个样本中,第一个整数的大小远远超过了 float 的最大精度。

在 64 位 Mac 上, float 最多可以表示 15 位小数:

>>> import sys
>>> sys.float_info.dig
15

但是您的整数使用 20 位数字。为了匹配指数,必须将 16.0 float 截断为 15 位有效数字,这意味着它基本上四舍五入为 0。

如果您必须对长整数使用浮点运算,请使用decimal.Decimal() 类型,它不受硬件限制:

>>> import decimal
>>> (2**32-1)**2 - decimal.Decimal('4.0') ** 2 - (2**32-1)**2
Decimal('-16.00')

关于Python 关于舍入的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18974509/

相关文章:

python - 循环 View 中的模型对象字段

Python 模块范围

python - 在python中解码html编码的字符串

python - python中如何获取指定路径下的文件?

c# - 如何处理大多数小数不能用二进制准确表示的事实?

Python:一种避免 <<print "variable_name =", variable_name>> 的方法?

python-2.7 - Pandas 简单的 X Y 图

python-2.7 - 如何在 Ubuntu 20.04 (Focal Fossa) 中为 Python 2.7 安装 python-mysqldb?

floating-point - 并行性: Subtly different floating point results?

floating-point - 对于接近统一的值, float 学是否更精确?