10.7Kпросмотров
98.4%от подписчиков
4 сентября 2025 г.
📷 ФотоScore: 11.8K
Деньги в MySQL: DECIMAL против FLOAT 💸 ❗️Почему это важно
В финансах «копейка рубль бережёт»: ошибка 0.01 в одной транзакции, умноженная на тысячи строк, ломает отчёты и бухгалтерию. Главный выбор — где хранить деньги: в DECIMAL или FLOAT? 1️⃣ Короткий ответ
🔹 Для сумм, цен, налогов — используйте DECIMAL(precision, scale). 🔹FLOAT/DOUBLE — приблизительные числа (двойичные), для денег не подходят. 2️⃣ Что такое DECIMAL и FLOAT?
🔹 DECIMAL(p, s) — точные десятичные числа. Хранит каждую цифру (до 65 знаков, обычно s=2 или 4). 🔹 FLOAT/DOUBLE — числа с плавающей запятой в двоичной форме (IEEE 754). Быстрые, но дают «хвосты» 0.1000000000001. Пример проблемы с FLOAT: CREATE TEMPORARY TABLE t_f (a FLOAT, b FLOAT); INSERT INTO t_f VALUES (0.1, 0.2);
SELECT a + b AS sum_val FROM t_f;
-- sum_val может быть 0.3000000119... Так же, но с DECIMAL: CREATE TEMPORARY TABLE t_d (a DECIMAL(10,2), b DECIMAL(10,2)); INSERT INTO t_d VALUES (0.10, 0.20);
SELECT a + b AS sum_val FROM t_d;
-- sum_val = 0.30 3️⃣ Как выбрать размер DECIMAL
Типовой набор:
🔹DECIMAL(19,4) — для сумм и цен (4 знака после запятой хватает для НДС/комиссий).
🔹DECIMAL(10,2) — для розничных цен в «валютах с 2 знаками». 4️⃣ Альтернатива: хранить в «копейках»
Иногда суммы хранят как INT в минимальных единицах (центы/копейки).
Плюсы: быстрые индексы, чёткие сравнения.
Минусы: нужна дисциплина преобразований (делить/умножать на 100), разные валюты ≠ одинаковая точность. 5️⃣ Мини-резюме
🔹 Для денег — только DECIMAL (или INT в минимальных единицах).
🔹 Выберите подходящую точность (часто DECIMAL(19,4)).
🔹 Не складывайте «яблоки и апельсины»: валюты и точности должны быть явными.