【问题标题】:Unexpected rounding error with simple addition [duplicate]简单加法的意外舍入错误[重复]
【发布时间】:2020-06-17 15:15:11
【问题描述】:

早安,

我遇到了一个奇怪的舍入错误,我不确定为什么。

print(-0.0075+0.005)

在终端出现

-0.0024999999999999996

这似乎在我的程序的其余部分抛弃了数学。鉴于此函数中的数字可能介于 10.0001 之间,因此小数位数可能会有所不同。

任何想法为什么我没有得到-0.0025 的预期答案

【问题讨论】:

  • 使用Decimal 模块。
  • 如果您需要任意精度的有理数,请尝试fractions 模块。

标签: python python-3.x math rounding rounding-error


【解决方案1】:

乔, 您所指的“舍入误差”是 Python 用来执行请求操作的算术系统的结果(尽管绝不限于 Python!)。

所有实数都需要在计算机程序中用有限数量的位表示,因此它们被“四舍五入”为合适的表示。这是必要的,因为对于有限数量的位,不可能精确地表示所有实数(甚至是实线中数字的有限区间)。因此,虽然您可以将变量定义为“a=0.005”,但计算机会将其存储为非常接近但不完全如此的东西。通常,这种舍入是通过 floating-point representations 完成的,标准 Python 就是这种情况。在这个系统的二进制版本中,实数用整数乘以 2 的幂来表示。

因此,您正在执行的诸如求和之类的运算会在这个“四舍五入”版本的数字上进行运算,并返回另一个四舍五入的结果。这意味着计算机中的算术始终是近似的,尽管通常它足够精确,我们并不关心。如果这些舍入误差对您的应用程序来说太大,您可以尝试切换到使用更精确的表示(更多位)。你可以在 Python's docs 上找到一个很好的解释器和例子。

【讨论】:

  • 请注意,有限位数并不排除任意位数。就像 Python 有任意精度的整数一样,represent rational numbers with arbitrary precision 也是可能的。任何十进制数都可以用这种方式表示。固定精度有理数是默认值,因为它们明显更快,而不是因为没有其他选择。
  • 感谢您的反馈。我是否理解用于表示数字的浮点数不会改变数字的十进制值。因此,如果我保留所有计算并使用 Decimal 函数转换最终输出,我将获得预期的表示?或者这些浮点是否有可能导致计算中的错误?
  • 乔,不确定您所说的“不会更改数字的十进制值”是什么意思。如果您的意思是当您执行 a=0.05 时,a 将恰好为 0.05,那么答案通常是否定的。由于使用二进制浮点,大多数有限十进制表达式不能精确表示。例如,0.5 可以精确表示(本质上为 1x2^-1),但 0.05 不能。看起来小数通常是精确表示的,但这只是因为在显示数字时进行了四舍五入(即只显示前 N 个数字)。
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 2013-04-02
  • 2013-06-30
  • 2016-04-11
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多