首页 > 解决方案 > Python 十进制() | 十进制.InvalidOperation

问题描述

我想克服从 python 2 迁移到 3 时遇到的 Decimal 问题。

蟒蛇 2.7:

>>> Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
Decimal('333.00')

蟒蛇 3.7:

>>> Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

如示例所示,这些 python 版本之间存在行为变化。

我错过了什么吗?

欢迎任何见解。

标签: python-2.7python-3.7

解决方案


decimal.get_context().prec当低于您的预期回合时,此附加

例子:

In [3]: from decimal import Decimal

In [4]: Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
Out[4]: Decimal('333.00')

In [5]: decimal.getcontext()
Out[5]: Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

In [6]: round(Decimal('333'), 2)
Out[6]: Decimal('333.00')

但如果你这样做:

import decimal
In [11]: context = decimal.getcontext()
In [12]: context.prec = 1
In [13]: decimal.setcontext(context)
In [15]: Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
---------------------------------------------------------------------------
InvalidOperation                          Traceback (most recent call last)
<ipython-input-15-24094f7b9eb1> in <module>
----> 1 Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)

InvalidOperation: [<class 'decimal.InvalidOperation'>]

所以请记住,您的 context.precision 需要大于或等于您的舍入需求


推荐阅读