Как хранить деньги в базах данных и почему это не так просто, как кажется#почитать
Некоторые валюты имеют фиксированный курс к другой валюте. Например, гонконгский доллар (HKD) с 1983 года привязан к доллару США в диапазоне 7,75-7,85 HKD за 1 USD.
Большинство валют ведут себя предсказуемо: 2 знака после запятой (точность, precision) — доллары, евро, рубли с их центами и копейками. Но есть и «особенные» — японская йена вообще без дробных частей, а иорданский динар делится на 1000 филсов и может довести до тысячных (0.001 JOD). Приятно, когда есть стандарты, но реальный мир любит отклонения.
Мавритания и Мадагаскар пошли своим путем: их валюты не используют десятичную систему: 1 угия = 5 хумов, 1 ариари = 5 ираймбиланджа.
У криптовалют может быть до 18 десятичных знаков (например, у ETH).
Количество знаков после запятой может изменяться со временем из-за инфляции. Деноминация решает проблему кардинально, но требует введения нового валютного кода. Пример из российской практики: до 29 февраля 2004 года использовался код валюты RUR (810), а после деноминации был введен RUB (643). Интересно, что в некоторых legacy-системах до сих пор можно встретить старый код.
У некоторых валют младшие единицы существуют только на бумаге — физически 0.1 японской йены или 0.1 южнокорейской воны не существует, хотя технически такие суммы возможны в расчетах.
При хранении цен на недорогие товары может потребоваться дополнительная точность. Например, после конвертации товар за $0.01 может стоить 0.009 евро — такую цену нужно где-то хранить, даже если евро формально имеет только 2 знака после запятой.
⏱Читать статью