我正在尝试阅读财务数据并存储它。我从商店获得财务数据的地方数据具有令人难以置信的精度,但我只对小数点后的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'而不是原始值,那也可以!发生了什么事?
谢谢!
答案 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信号。这保证了,除非有 错误条件,量化指数总是等于 右手操作数。
但我必须承认我不知道这意味着什么。