PHP / MySQL:最佳资金运营/存储实践?

时间:2009-07-04 10:51:33

标签: php mysql decimal currency floating-accuracy

所以,我打算制作一个应用程序(PHP / MySQL),它可以处理很多钱,我正在考虑如何存储和操作钱,参考PHP浮点数据类型和MySQL十进制。

我在考虑两种选择。其中之一是以整数分钱格式($ dollar * 100)操作和存储货币,以便不处理浮动预处理并将其作为整数存储在DB中。另一个是以DB为单位存储在十进制数中,并在PHP中使用BC Math进行计算。

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

(我不会采取你应该使用BCMath的立场 - 我只是给你提供信息。)