在Python中使用“Decimal”
有人能解释一下下面发生了什么吗?(我用的是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.1
和 0.3
这两个数字在计算机里不能被准确表示为 float
类型。
In [3]: '%.20f' % 0.1
Out[3]: '0.10000000000000000555'
In [4]: '%.20f' % 0.3
Out[4]: '0.29999999999999998890'
所以,当你用 0.1
或 0.3
来初始化 Decimal()
时,得到的值只是大约等于 0.1
或 0.3
。
如果你用字符串(比如 "0.1"
或 "0.3"
)来表示,就不会有这个问题。
最后,你的第二个例子和第三个例子得到的结果不同,原因是虽然它们都涉及到隐式的四舍五入,但四舍五入到的小数位数不同。