Глава 4 · Python любит числа

Decimal — когда нужна точная десятичная арифметика

Для денег и учёта даже крошечная погрешность float может быть неприемлема — разберём инструмент, который её убирает.

Мы уже видели, что float хранит приближение (раздел 4.11). Для большинства задач это не проблема — но для денег даже крошечная погрешность накапливается и может стать заметной. Для этого в стандартной библиотеке есть модуль decimal.

decimal_demo.py
from decimal import Decimal

print(Decimal("0.1") + Decimal("0.2"))  # 0.3 — точно, без погрешности

Создавайте Decimal из строки, не из float

Это едва ли не самая важная практическая деталь во всём разделе:

stroka_vs_float.py
from decimal import Decimal

print(Decimal("19.99"))  # Decimal('19.99') — именно то, что вы написали
print(Decimal(19.99))    # Decimal('19.9900000000000002131628...') — унаследовал погрешность float!
Почему так происходит
Decimal(19.99) сначала создаёт обычный float 19.99 — уже с тем самым приближением из раздела 4.11 — а потом заворачивает это приближённое значение в Decimal. Точность к этому моменту уже потеряна. Decimal("19.99") читает текст напрямую и не проходит через float вообще — поэтому сохраняет именно то значение, которое вы написали.

Пример: покупка

pokupka.py
from decimal import Decimal

price = Decimal("19.99")
quantity = 3
total = price * quantity
print(total)  # 59.97 — точно

Decimal — не «всегда лучше»

floatDecimal
СкоростьБыстрый — аппаратная поддержкаМедленнее — программная реализация
Типичное применениеНаучные расчёты, измерения, общего назначенияДеньги, бухгалтерия, где важна десятичная точность
ТочностьДвоичное приближениеТочная десятичная запись
Не заменяйте каждый float на Decimal
Decimal — правильный выбор для денег и учёта, где важна десятичная точность и предсказуемое округление. Для большинства научных и повседневных вычислений обычный float быстрее и абсолютно достаточен.
Практика: Decimal и деньги
Интерактивный ноутбук прямо в браузере — Decimal(str) vs Decimal(float)
Открыть практику →