Принятый ответ в основном правильный, за исключением константы, используемой для операции округления. Вы должны использовать ROUND_HALF_UP
вместо ROUND_05UP
для валютных операций. Согласно документам :
десятичное. ROUND_HALF_UP
Округление до ближайшей связи, уходящей от нуля.
десятичное. ROUND_05UP
Округление от нуля, если последняя цифра после округления до нуля была бы 0 или 5; в противном случае округление до нуля.
Использование ROUND_05UP
будет округлять (только для положительных чисел) только в том случае, если число на сотом месте было 5 или 0, что неправильно для математики валют.
Вот несколько примеров:
>>> from decimal import Decimal, ROUND_05UP, ROUND_HALF_UP
>>> cents = Decimal('0.01')
>>> Decimal('1.995').quantize(cents, ROUND_HALF_UP)
Decimal('2.00') # Correct
>>> Decimal('1.995').quantize(cents, ROUND_05UP)
Decimal('1.99') # Incorrect
>>> Decimal('1.001').quantize(cents, ROUND_HALF_UP)
Decimal('1.00') # Correct
>>> Decimal('1.001').quantize(cents, ROUND_05UP)
Decimal('1.01') # Incorrect