【问题标题】:Python floating point precision sumPython浮点精度和
【发布时间】:2018-07-12 18:28:18
【问题描述】:

我在 python 中有以下数组

n = [565387674.45, 321772103.48,321772103.48, 214514735.66,214514735.65, 357524559.41]

如果我将所有这些元素相加,我会得到:

sum(n)
1995485912.1300004

但是,这个总和应该是:

1995485912.13

通过这种方式,我知道了浮点“错误”。我已经使用了 numpy 中的 isclose() 函数来检查更正的值,但是 这个限制是多少?有什么办法可以减少这种“错误”?

这里的主要问题是错误传播到其他操作,例如,以下断言必须为真:

assert (sum(n) - 1995485911) ** 100 - (1995485912.13 - 1995485911) ** 100 == 0.

【问题讨论】:

  • Python 有 math.fsum 来计算“精确的浮点和”,但 its documentation 是模糊的。它通常比简单的串行加法返回更好的结果,但它并不总是以浮点格式返回可能的最佳结果。
  • 谢谢,这个方法对我有用。

标签: python-3.x floating-point precision


【解决方案1】:

这是浮点数的问题。一种解决方案是以字符串形式表示它们并使用decimal 模块:

n = ['565387674.45', '321772103.48', '321772103.48', '214514735.66', '214514735.65',
     '357524559.41']

from decimal import Decimal

s = sum(Decimal(i) for i in n)

print(s)

打印:

1995485912.13

【讨论】:

    【解决方案2】:

    您可以使用round(num, n) 函数将数字四舍五入到所需的小数位。因此,在您的示例中,您将使用 round(sum(n), 2)

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2018-02-23
      • 2013-01-10
      • 2012-06-25
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多