Python十进制和奇怪的行为

Python十进制和奇怪的行为,python,math,decimal,Python,Math,Decimal,这一定是我的错,但我不明白发生了什么事。 这里是代码与该行为 在循环中,我们得到了价值: type of data[name]['money_receive'] is Vividict class Vividict(dict): def __missing__(self, key): value = self[key] = type(self)() return value 所以 我明白了 1659605.00 Receive <class 'de

这一定是我的错,但我不明白发生了什么事。 这里是代码与该行为

在循环中,我们得到了价值:

type of data[name]['money_receive']
is Vividict

 class Vividict(dict):
    def __missing__(self, key):
       value = self[key] = type(self)()
       return value
所以

我明白了

1659605.00 Receive <class 'decimal.Decimal'>
1.660E+6 Receive All <class 'decimal.Decimal'>
print "%.2f"%column_sum["money_receive"]
1660000.00
1659605.00接收
1.660E+6接收所有
打印“%.2f”%column\u sum[“money\u receive”]
1660000

但是我不明白为什么。

十进制模块根据上下文中要求的精度对计算进行循环。如果更改默认值,则会得到所描述的情况:

>>> import decimal
>>> print '%f' % (decimal.Decimal('1659605.00') + decimal.Decimal('0.0'))
1659605.000000
>>> decimal.getcontext().prec=4
>>> print '%f' % (decimal.Decimal('1659605.00') + decimal.Decimal('0.0'))
1660000.000000
>>> 
您可以创建不同的上下文并临时使用它

>>> ctx = decimal.Context(prec=60)
>>> oldctx = decimal.getcontext()
>>> decimal.setcontext(ctx)
>>> print '%f' % (decimal.Decimal('1659605.00') + decimal.Decimal('0.0'))
1659605.000000
>>> decimal.setcontext(oldctx)
或者在ctx对象本身中进行计算

>>> print '%f' % ctx.add(decimal.Decimal('1659605.00'), decimal.Decimal('0.0'))
1659605.000000

什么?你在期待什么?你的输出有什么不同?我认为1659605.00+0.00=1659605.00不是1660000.00验证它是-
Decimal('0.00')+Decimal('1659605.00')
Decimal('1659605.00')
,正如你所期望的,所以你的其他假设之一肯定是不正确的。请阅读并将代码缩减到实际问题。@jonrsharpe是的,但在我的生产代码中,我将小数('1659605.00')四舍五入到1.660E+6。如果这么简单,我就不会问了。在代码中,我试图重复生产环境。@Darius——不仅仅是理论上——这正是它所做的。当精度为4时,
十进制
模块将四舍五入到4位。这是你的“问题”,但可能根本不是问题。这段代码就是为了达到这样的精度而编写的,所以这是一个判断是否正确的问题。很抱歉,在单击“删除”之前,我没有看到您的答案。
>>> print '%f' % ctx.add(decimal.Decimal('1659605.00'), decimal.Decimal('0.0'))
1659605.000000