Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top