Глава 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 — не «всегда лучше»
| float | Decimal | |
|---|---|---|
| Скорость | Быстрый — аппаратная поддержка | Медленнее — программная реализация |
| Типичное применение | Научные расчёты, измерения, общего назначения | Деньги, бухгалтерия, где важна десятичная точность |
| Точность | Двоичное приближение | Точная десятичная запись |
Не заменяйте каждый float на Decimal
Decimal — правильный выбор для денег и учёта, где важна десятичная точность и предсказуемое округление. Для большинства научных и повседневных вычислений обычный
float быстрее и абсолютно достаточен.Практика: Decimal и деньги
Интерактивный ноутбук прямо в браузере — Decimal(str) vs Decimal(float)