Подтвердить что ты не робот

PHP/MySQL: лучшие методы работы/хранения денег?

Итак, я планирую сделать приложение (PHP/MySQL), которое много касается денег, и я думаю о том, как хранить и работать с деньгами, ссылаясь на тип данных float PHP и десятичный код MySQL.

Я думал о двух вариантах. Один из них - работать и хранить деньги в формате целых центов ($ доллары * 100), чтобы не иметь дело с float inprecisions и хранить его в БД как целое. Другая - хранить в DB как десятичную и использовать BC Math в PHP для вычислений.

Итак, я всю ночь искал в googled, чтобы узнать, какой вариант лучше всего использовать, и не нашел ясного ответа. Единственный разумный вариант, который я видел, это целые центы (что мне не очень нравится, потому что это будет означать много конвертирования от долларов до центов и наоборот) перед каждым отображением в браузере и перед сохранением в БД).

Кроме того, люди жаловались на то, что MySQL десятичный (MySQL хранит десятичные числа в виде строк, использует их как плавающие и т.д.), но это были старые сообщения. Согласно документации MySQL, текущая версия обрабатывает десятичные знаки правильно, единственная жалоба заключалась в том, что она обрезает долю значений, превышающих объявленную длину дробной части (например, если вы сохраняете значение 12.326 в столбце, объявленном десятичным (9,2)), но из моих исследований он округляет его, а не просто усекает (12.326 становится 12.33), что, по моему мнению, является правильным.

И я не нашел рекомендаций по хранению денег как десятичных знаков и расчетам с использованием PHP BCMath, и, на мой взгляд, это объясняется тем, что мало кто знает о математических функциях BC и GMP.

Итак, что было бы лучшим вариантом для использования, учитывая точность, скорость (скорость вычислений BCMath, десятичную скорость MySQL и целое число) и удобство программирования?

4b9b3361

Ответ 1

Я бы определенно хотел использовать ints и маршрутизировать все через стиль объекта данных (ORM), который затем обрабатывает все преобразования для вас. Клиентский код, использующий объект данных, никогда не будет нуждаться в преобразовании и не заботится о нем, в то время как у вас не будет проблем с хранением, поскольку базы данных легко обрабатываются int. Кроме того, вы можете легко добавить любые другие методы для денежного объекта (например, преобразования между типами денег и т.д.).

Ответ 2

Мне также не удалось найти информацию о BCMath, поэтому я исследовал ее и написал свою статью об этом: http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/.

(Я не понимаю, что вы должны использовать BCMath - я просто даю вам информацию.)