Итак, я планирую сделать приложение (PHP / MySQL), которое много касается денег, и я думаю о том, как хранить и работать с деньгами, имея в виду тип данных float PHP и MySQL десятичный.
Я думал о двух вариантах. Один из них – работать и хранить деньги в формате целых центов ($ доллары * 100), чтобы не иметь дело с float inprecisions и хранить его в БД как целое. Другой – хранить в БД как десятичную и использовать BC Math в PHP для вычислений.
Поэтому я всю ночь искал в Интернете, чтобы узнать, какой вариант лучше всего использовать, и не нашел ясного ответа. Единственный разумный вариант, который я видел, это целые центы (что мне не очень нравится, потому что это будет означать много конвертирования от долларов до центов и наоборот) перед каждым отображением в браузере и перед сохранением в БД).
Кроме того, люди жаловались на то, что MySQL десятичный (MySQL хранит десятичные числа в виде строк, использует их как плавающие и т. Д.), Но это были старые сообщения. Согласно документации MySQL, текущая версия обрабатывает десятичные знаки правильно, единственная жалоба заключалась в том, что она обрезает долю значений, превышающих объявленную длину дробной части (например, если вы сохраняете значение 12.326 в столбце, объявленном десятичным (9,2)), , но из моих исследований он округляет его, а не просто усекает (12.326 становится 12.33), что, на мой взгляд, является правильным.
И я не нашел рекомендации по хранению денег как десятичных знаков и расчетам с использованием PHP BCMath, и, на мой взгляд, это объясняется тем, что мало кто знает о функциях математики BC и GMP.
Итак, какой будет лучший вариант использования, учитывая точность, скорость (скорость вычислений BCMath, десятичную скорость MySQL и целое число) и удобство программирования?
Я определенно хотел бы использовать ints и маршрутизировать все через стиль объекта данных (ORM), который затем обрабатывает все преобразования для вас. Клиентский код, использующий объект данных, никогда не будет нуждаться в преобразовании и не заботится о нем, в то время как у вас не будет проблем с хранением, поскольку базы данных легко обрабатываются int. Кроме того, вы можете легко добавить любые другие методы для денежного объекта (например, преобразования между типами денег и т. Д.).
У меня также возникли проблемы с поиском информации о BCMath, поэтому я исследовал его и написал свою статью об этом: http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/ .
(Я не принимаю позицию, что вы должны использовать BCMath – я просто даю вам информацию.)