在 PHP 中使用货币值的最佳实践?

2022-08-30 11:53:39

我需要在PHP中添加,乘法和比较货币值,并且需要确保它精确到一分钱。

一种方法是将所有东西都存储在浮子中,在每次操作前后使用圆形,并在比较时使用心机epsilon进行相等。相当麻烦,恕我直言。

另一种方法是将整个内容存储为整数数据类型中的美分,并记住在我使用数据库时来回转换(mysql,我使用十进制数据类型)。不雅,还有很多错误陷阱,恕我直言。

另一种方法是发明我自己的“数据类型”,将所有值存储在字符串中(“34.12”),并创建我自己的数学替换函数。这些函数将在内部将值转换为整数,进行计算并再次输出字符串的结果。极其复杂,恕我直言。

我的问题是:在PHP中使用货币值的最佳实践是什么?谢谢!


答案 1

从MySQL v5.0.3开始,MySQLs数据类型存储一个精确的十进制数,即不是不准确的浮点表示。DECIMAL

要正确操作 PHP 中的精度数字,请使用任意精度数学函数。在内部,此库操作文本字符串。

货币旨在存储为十进制数,您可以获得小于美分的货币单位。您只应在显示数字时舍入任何值,而不是在操作或存储期间舍入。


答案 2

2016年更新:

几年后,希望;)更明智一点
,因为这个答案仍然偶尔收到上下投票,我觉得有必要修改我的答案。我绝对不建议再将“钱”存储为整数。唯一真正的答案是Andrew Dunn的:使用Mysql的DECIMAL类型并将php的bc_*函数封装在Currency类中。


为了完整起见,我将保留我过时的答案

应始终使用整数。将值作为 int 存储在数据库中,使用 int 进行计算,以及何时(仅当要打印它时)将其转换为某种可读格式。

通过这种方式,您可以完全规避浮点问题,这通常是在处理货币时的一个大问题;)

编辑:值得一提的一件事是:在开始以这种方式工作之前,您需要考虑精度。正如其他人所指出的,您可能需要使用小于一美分的值,因此您需要相应地进行乘法/除法。(即货币 * 1000 表示 .001 精度)


推荐