Python cdecimal InvalidOperation - PullRequest
       28

Python cdecimal InvalidOperation

9 голосов
/ 10 марта 2012

Я пытаюсь прочитать финансовые данные и сохранить их.Место, где я получаю финансовые данные, хранит данные с невероятной точностью, однако меня интересуют только 5 цифр после десятичной точки.Поэтому я решил использовать 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 Ответ

14 голосов
/ 10 марта 2012

десятичная версия дает лучшее описание ошибки:

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 сигнализируется. Это гарантирует, что, если нет В случае ошибки квантованный показатель всегда равен показателю правый операнд.

Но я должен признаться, я не знаю, что это значит.

...