您没有以正确的方式使用Decimal.
>>> from decimal import *
>>> Decimal(1./3.) # Your code
Decimal('0.333333333333333314829616256247390992939472198486328125')
>>> Decimal("1")/Decimal("3") # My code
Decimal('0.3333333333333333333333333333')
在“您的代码”中,您实际执行“经典”浮点除法 – 然后将结果转换为小数.浮点引入的错误会传播到您的Decimal.
在“我的代码”中,我做了十进制除法.生成到最后一位数字的正确(但截断)结果.
关于四舍五入.如果您使用货币数据,则必须知道用于业务舍入的规则.如果不是这样,使用Decimal将不会自动解决您的所有问题.这是一个例子:3个股东之间分享100美元.
>>> TWOPLACES = Decimal(10) ** -2
>>> dividende = Decimal("100.00")
>>> john = (dividende / Decimal("3")).quantize(TWOPLACES)
>>> john
Decimal('33.33')
>>> paul = (dividende / Decimal("3")).quantize(TWOPLACES)
>>> georges = (dividende / Decimal("3")).quantize(TWOPLACES)
>>> john+paul+georges
Decimal('99.99')
Oups:错过$.01(银行的免费礼物?)