在Python中使用“Decimal”

3 投票
1 回答
4307 浏览
提问于 2025-04-17 13:59

有人能解释一下下面发生了什么吗?(我用的是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的结果不同,尽管它们都没有" "

1 个回答

9

简单来说,0.10.3 这两个数字在计算机里不能被准确表示为 float 类型。

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

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

所以,当你用 0.10.3 来初始化 Decimal() 时,得到的值只是大约等于 0.10.3

如果你用字符串(比如 "0.1""0.3")来表示,就不会有这个问题。

最后,你的第二个例子和第三个例子得到的结果不同,原因是虽然它们都涉及到隐式的四舍五入,但四舍五入到的小数位数不同。

撰写回答