【问题标题】:PHP/MySQL: Best money operations/storing practices?PHP/MySQL:最佳货币操作/存储实践?
【发布时间】:2010-11-08 02:15:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 虽然对于 OP 来说有点晚了,但对于任何感兴趣的人,我开源了一个 PHP Money library,它可以根据可用的内容使用纯 PHP、GMP 或 BCMath 对任何大小的货币执行安全计算。哦,我将我的钱作为整数存储在数据库中。

标签: php mysql decimal currency floating-accuracy


【解决方案1】:

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

(我没有采取你应该使用 BCMath 的立场——我只是给你提供信息。)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1 用于将钱存储为整数。这适用于多种货币:将钱与货币代码一起存储,您突然不关心您的DECIMAL 是应该使用 2 位小数(对于美元)还是 0 位小数(对于日元)。 123.00 美元将存储为 [12300, 'USD'],而 JPY 123 将存储为 [123, 'JPY']。当然,永远不要在任何与金钱相关的计算或存储中使用浮点数
    • 如果您只使用几种货币,并且知道要乘以的因子,并且您知道与您互动的每个人都这样做,那么使用 int 将起作用。如果不是......好吧,它可能仍然有效。
    猜你喜欢
    • 2011-04-18
    • 2011-10-29
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多