Python Decimal: округлить денежную сумму без float
Для денежных расчётов используйте decimal.Decimal вместо двоичного float: так десятичные значения вроде 0.1 не накапливают двоичную погрешность. quantize задаёт точность до копеек, а режим округления выбирается явно. Передавайте Decimal строкой, чтобы не переносить ошибку из float.
Рабочий пример
from decimal import Decimal, ROUND_HALF_UP
price137 = Decimal("19.995")
total137 = price137.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(total137) # 20.00ROUND_HALF_UP округляет половину вверх. Для налогов и финансовых документов следуйте правилам предметной области: в разных расчётах может требоваться другой режим округления.
Частый вопрос
Почему результат округления может отличаться от round()?
round использует правила Python для float, включая двоичное представление и округление половины к чётному. Decimal позволяет задать точность и правило явно.