2024 08 26 решённые проблемы человечества
(084/100) решённые проблемы человечества / 2
Продолжаем над проблемами. Сегодня у нас про хранение денег и их расчёты. Кажется, что у всех сегодня стоят мобильные банки и про наличные деньги вспоминаем только в поездке. Проблема решена?
Начать стоит издалека - float. Тема, которую я игнорировал в классах информатики, добежала до меня через 5 лет. Повторим мантру - никогда не храните деньги во флоатах (на самом деле, ну не совсем). Флоаты состоят из знака, порядка(мантисса) и величины для того, чтобы на CPU было быстро сравнивать числа разного порядка. Проблема здесь в том, что количество разрядов на число у нас ограничено, поэтому операции сложения вполне привычных чисел (иррациональных корней) начинает приносить ошибки. Глубже умного ничего не напишу, лучше посмотреть отличный ролик с канала Никиты Соболева - https://www.youtube.com/watch?v=lRrg8oiMRaE.
Дальше есть следующий уровень - раз у нас беда с запятой, давайте её уберём. Так пришли к арифметике с фиксированным знаком. Мы берём нашу сумму умножаем на 100 и храним в integer. Вся сумма в копейках, так как это минимальная разменная единица. Так как иногда возникают ошибки при делении, то можно сделать умножение на достаточно большую величину (миллиард) и хранить наноденьги. Хороший способ, если не используется несколько валют и ошибки не накапливаются.
В какой-то момент люди все типовые ошибки собрали и сделали специальную структуру - decimal. В ней задаётся предельный размер целой и дробной части, и реализованы все возможные правила округления. Для golang даже есть высокопроизводительная версия - https://github.com/robaho/fixed/. Беда только в том, когда между языками начинаются проблемы в округлении - https://github.com/robaho/fixed/issues/24.
Выводов не будет, завтра про биллинг для подписок.
#марафон @chernov_sharit