Python Decimal: округлить денежную сумму без float

Категория: Python · Язык: Python · Обновлено:

Для денежных расчётов используйте decimal.Decimal вместо двоичного float: так десятичные значения вроде 0.1 не накапливают двоичную погрешность. quantize задаёт точность до копеек, а режим округления выбирается явно. Передавайте Decimal строкой, чтобы не переносить ошибку из float.

Рабочий пример

Python
from decimal import Decimal, ROUND_HALF_UP
price137 = Decimal("19.995")
total137 = price137.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(total137)  # 20.00

ROUND_HALF_UP округляет половину вверх. Для налогов и финансовых документов следуйте правилам предметной области: в разных расчётах может требоваться другой режим округления.

Частый вопрос

Почему результат округления может отличаться от round()?

round использует правила Python для float, включая двоичное представление и округление половины к чётному. Decimal позволяет задать точность и правило явно.