简单求和的 Python 舍入误差

use*_*978 4 python precision rounding

>>> sum([0.3, 0.1, 0.2])
0.6000000000000001

>>> sum([0.3, 0.1, 0.2]) == 0.6
False
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ton 5

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

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

from decimal import Decimal

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

print(sum([num1, num2, num3]))
Run Code Online (Sandbox Code Playgroud)

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

Decimal('0.6')  # One can do float() on this output to get plain (0.6).
Run Code Online (Sandbox Code Playgroud)

这很方便也是Decimal您可以使用的对象。

  • “十进制”也是浮点数,只是使用不同的基数。它可以准确地表示以十进制表示法写入的文字,但在其他情况下,其准确性不如二进制(“普通”)浮点数。 (2认同)
  • @user2460978 没错。“小数”存储为 {某个整数} * 10^x,而不是 {某个整数} * 2^x(这就是“浮点数”的样子)。 (2认同)