我使用十进制模块来避免浮点舍入错误。就我而言,这些值是金钱,所以我想要两位小数。
为了做到这一点,我做了
decimal.getcontext().prec = 2
,但后来我得到了一些令人惊讶的结果,这让我觉得我错过了一些东西。在此代码中,第一个断言有效,但第二个断言失败
from decimal import getcontext, Decimal
assert Decimal("3000") + Decimal("20") == 3020
getcontext().prec = 2
assert Decimal("3000") + Decimal("20") == 3020 # fails
由于
3000
和 20
是整数,所以我希望它成立,但我得到 3000
。对正在发生的事情有什么想法吗?
decimal
不直接实现定点运算。它实现以 10 为基数的floating点算术。精度(prec
)是保留有效数字的总数,与小数点的位置无关。
尝试显示上一个示例中的计算值:
>>> Decimal("3000") + Decimal("20")
Decimal('3.0E+3')
准确的结果 (3020) 将四舍五入到最高有效数字 2(因为您将
prec
设置为 2),因此后面的“20”将被丢弃。
例如,如果您想要小数点后 2 位,则必须自行安排。在 the docs 中搜索问题“一旦我有了有效的两个位置输入,如何在整个应用程序中保持该不变性?”。