PHP/MySQL:最好的货币操作/存储实践?

因此,我计划制作一个处理大量资金的应用程序(PHP / MySQL),并且我正在考虑如何使用资金进行存储和操作,指的是PHP浮点数据类型和MySQL十进制。

我在想两个选择。其中之一是以整数美分格式($dollars * 100)操作和存储货币,以便不处理浮点数切值并将其也作为整数存储在数据库中。另一个是将数据库存储为十进制,并在PHP中使用BC Math进行计算。

所以我整晚都在谷歌上搜索,找出哪个是最好的选择,但没有找到明确的答案。我见过的唯一合理的选择是整数美分(我真的不喜欢,因为它意味着在浏览器中每次显示之前和存储在数据库中之前都要从美元转换为美分,反之亦然)。

此外,人们抱怨MySQL十进制(MySQL将小数存储为字符串,将它们作为浮点数等操作),但这些都是旧帖子。根据MySQL文档,当前版本正确处理小数,唯一的抱怨是它截断了超过声明分数长度的值的分数(例如,如果您在声明为decimal(9,2)的列中存储值12.326),但从我的调查中,它会四舍五入它而不仅仅是截断(12.326变成12.33), 在我看来,这是正确的。

而且,我没有找到任何关于将钱存储为小数并使用PHP BCMath进行计算的建议,在我看来,这是因为很少有人知道BC和GMP数学函数。

那么,考虑到精度,速度(BCMath计算速度,MySQL十进制速度与整数)和编程舒适性,使用的最佳选择是什么?


答案 1

我肯定会使用int并通过数据对象(ORM)样式路由所有内容,然后为您处理所有转换。使用数据对象的客户端代码将永远不需要进行转换,也不会关心,而您不会遇到存储问题,因为数据库可以轻松处理int。此外,您可以非常轻松地添加货币对象所需的任何其他方法(例如货币类型之间的转换等)。


答案 2

我也很难找到有关BCMath的信息,所以我研究了它并写了我自己的文章:http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/

(我并不是说你应该使用BCMath——我只是在给你提供信息。


推荐