Ответ
Для хранения денежных значений, таких как баланс счёта, критически важны точность и отсутствие ошибок округления. НЕ следует использовать типы с плавающей точкой (FLOAT, REAL, DOUBLE).
Рекомендуемые типы данных:
-
DECIMAL/NUMERIC(предпочтительный выбор)- Точный числовой тип. Хранит числа с фиксированной точностью и масштабом.
- Идеален для финансовых операций, так как исключает ошибки двоичного представления.
-- balance DECIMAL(15, 2) - 15 цифр всего, 2 после запятой CREATE TABLE account ( id BIGINT PRIMARY KEY, balance DECIMAL(15, 2) NOT NULL DEFAULT 0.00 );
-
INTEGER/BIGINT(альтернативный подход)- Хранение суммы в минимальных единицах (копейках, центах).
- Устраняет работу с дробями на уровне базы данных.
-- Баланс в центах (например, $100.50 хранится как 10050) CREATE TABLE account ( id BIGINT PRIMARY KEY, balance_cents BIGINT NOT NULL DEFAULT 0 ); - Плюсы: Максимальная производительность и точность целочисленных операций.
- Минусы: Требует преобразования в бизнес-логике приложения.
Практический совет: Используйте DECIMAL для простоты и ясности. Выберите достаточную точность (например, DECIMAL(19,4) для глобальных операций) и всегда выполняйте денежные расчёты внутри транзакций с соответствующей изоляцией.