【问题标题】:Python rounding error with simple sum简单求和的 Python 舍入误差
【发布时间】:2014-03-09 14:46:08
【问题描述】:
>>> sum([0.3, 0.1, 0.2])
0.6000000000000001

>>> sum([0.3, 0.1, 0.2]) == 0.6
False

如何使结果恰好为 0.6? 我不想将结果四舍五入到一定数量的十进制数字,因为那样我可能会失去其他列表实例的精度。

【问题讨论】:

  • 为什么你需要正好 0.6?如果1.0/3+2.0/3 不完全等于1,你会遇到同样的问题吗?
  • 我想要 0.6,因为这是我所期望的结果。是的,它会是同样的问题。
  • 已经有很多关于这个的帖子,例如:stackoverflow.com/questions/5595425/…
  • @user2460978 恐怕答案是调整你的期望。没有一种好的通用方法可以让有理数的数学像您期望的那样工作,同时仍然允许平方根和正弦之类的东西。
  • 欢迎使用浮点。 0.6 不能用二进制浮点数精确表示。

标签: python rounding precision


【解决方案1】:

float 在几乎所有语言中本质上都是不精确的,因为它不能用二进制精确表示。

如果您需要精确的精度,请使用 Decimal class:

from decimal import Decimal

num1 = Decimal("0.3")
num2 = Decimal("0.2")
num3 = Decimal("0.1")

print(sum([num1, num2, num3]))

这将return的结果非常令人满意:

Decimal('0.6')  # One can do float() on this output to get plain (0.6).

这也是一个方便的Decimal 对象,您可以使用它。

【讨论】:

  • Decimal 也是浮点数,只是使用了不同的基数。它可以准确地表示以十进制表示的文字,但在其他情况下又不如二进制(“普通”)浮点数准确。
  • 有趣。当您说“使用不同的基数”时,我假设它是以 10 为基数?
  • @user2460978 没错。而不是 {some integer} * 2^x(这就是 float 的样子),decimal 存储为 {some integer} * 10^x。
【解决方案2】:

使用math.fsome() 而不是sum()

【讨论】:

  • 我猜你的意思是math.fsum而不是math.fsome? (在 Python 中没有 math.fsome 这样的东西。)但即便如此,它也不能真正解决问题:例如,试试 math.fsum([0.1, 0.2, 0.4])。在典型的机器上,结果不会等于0.7
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2020-08-04
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多