【发布时间】: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