#python-2.7 #python-3.7
#python-2.7 #python-3.7
Вопрос:
Я хотел бы устранить проблему с десятичным числом, с которой я сталкиваюсь при переходе с python 2 на 3.
Python 2.7:
>>> Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
Decimal('333.00')
Python 3.7:
>>> Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
Как показывает пример, между этими версиями python происходит изменение поведения.
Я что — то там пропустил ?
Приветствуется любое понимание.
Ответ №1:
это добавляется, когда значение decimal.get_context().prec
меньше ожидаемого раунда
Exemple :
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 должен быть больше или равен вашим потребностям в округлении