19

所以,我打算做一个处理钱的应用程序(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 十进制速度与整数)和编程舒适度,最好的选择是什么?

4

2 回答 2

4

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

于 2009-07-04T11:09:38.687 回答
1

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

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

于 2009-07-04T19:08:37.603 回答