Python cdecimal InvalidOperation

时间:2012-03-10 17:38:14

标签: python decimal invalidoperationexception

我正在尝试阅读财务数据并存储它。我从商店获得财务数据的地方数据具有令人难以置信的精度,但我只对小数点后的5位数感兴趣。因此,我决定在我创建的Decimal上使用t = .quantize(cdecimal.Decimal('。00001'),rounding = cdecimal.ROUND_UP),但我一直得到一个InvalidOperation异常。这是为什么?

>>> import cdecimal
>>> c = cdecimal.getcontext()
>>> c.prec = 5
>>> s = '45.2091000080109'
>>> # s = '0.257585003972054' works!
>>> t = cdecimal.Decimal(s).quantize(cdecimal.Decimal('.00001'), rounding=cdecimal.ROUND_UP)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  cdecimal.InvalidOperation: [<class 'cdecimal.InvalidOperation'>]

为什么这里有无效操作?如果我将精度更改为7(或更高),它可以工作。如果我将s设置为'0.257585003972054'而不是原始值,那也可以!发生了什么事?

谢谢!

1 个答案:

答案 0 :(得分:14)

十进制版本可以更好地描述错误:

Python 2.7.2+ (default, Feb 16 2012, 18:47:58) 
>>> import decimal
>>> s = '45.2091000080109'
>>> decimal.getcontext().prec = 5
>>> decimal.Decimal(s).quantize(decimal.Decimal('.00001'), rounding=decimal.ROUND_UP)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/decimal.py", line 2464, in quantize
    'quantize result has too many digits for current context')
  File "/usr/lib/python2.7/decimal.py", line 3866, in _raise_error
    raise error(explanation)
decimal.InvalidOperation: quantize result has too many digits for current context
>>> 

Docs

  

与其他操作不同,如果系数之后的长度   量化操作将大于精度,然后是   发出InvalidOperation信号。这保证了,除非有   错误条件,量化指数总是等于   右手操作数。

但我必须承认我不知道这意味着什么。