2

有人可以解释一下下面发生了什么:(我使用 Python 3.3)

1. >>> Decimal("0.1") + Decimal("0.1") + Decimal("0.1") - Decimal("0.3")
       Decimal('0.0')

2. >>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
       Decimal('2.775557561565156540423631668E-17')

3. >>> Decimal(0.1 + 0.1 + 0.1 - 0.3)
       Decimal('5.5511151231257827021181583404541015625E-17')

我知道这与浮点限制有关,如果有人能解释原因,我会很高兴

  • " "与上面示例 1 和示例 2 之间的差异有什么关系
  • 鉴于两者都没有,为什么 2 会产生与 3 不同的答案" "
4

1 回答 1

7

简而言之,既0.1不能也0.3不能完全表示为float

In [3]: '%.20f' % 0.1
Out[3]: '0.10000000000000000555'

In [4]: '%.20f' % 0.3
Out[4]: '0.29999999999999998890'

因此,当您使用0.1or0.3来初始化Decimal()时,结果值大约 0.1是or 0.3

使用字符串("0.1""0.3")没有这个问题。

最后,您的第二个示例与您的第三个示例产生不同的结果,因为即使两者都涉及隐式舍入,它们涉及舍入到不同的小数位数。

于 2013-01-28T22:09:24.570 回答