在PHP中使用货币值的最佳做法?

时间:2010-09-29 07:18:01

标签: php types decimal

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

一种方法是将所有东西存储在浮点数中,在每次操作之前和之后使用回合,并在比较相等时使用思维机器epsilon。相当笨重的imho。

另一种方法是将整个事物存储为整数数据类型中的分数,并且记得在我使用数据库的任何时候来回转换(mysql,我使用十进制数据类型)。非常优雅,还有许多错误陷阱,imho。

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

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

5 个答案:

答案 0 :(得分:25)

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

要在PHP中正确操作精度数字,请使用arbitrary precision math functions。在内部,这个库操纵文本字符串。

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

答案 1 :(得分:4)

我自己回答一下。最佳做法是创建“金额”类。此类在内部将金额存储为整数美分,并提供getter,setter,数学函数,如加,减和比较。更干净。

答案 2 :(得分:3)

2016年更新:

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


为了完整起见,我会在这里保留过时的答案

  

您应该始终使用整数。将值存储为整数   您的数据库,使用int进行计算以及何时以及何时   你想打印它,把它转换成一些可读的格式。

     

这样你就可以解决浮点问题,   一般来说,与钱合作是一个大问题;)

     

编辑:有一点值得一提:你需要考虑精确度   在你开始以这种方式工作之前。正如其他人所指出的,你   可能需要使用小于1美分的值,所以你需要这样做   相应的乘法/除法。 (即货币* 1000表示   .001精度)

答案 3 :(得分:0)

将值保持为美分并使用整数。编写类或辅助函数以封装在UI中显示和处理数据库查询中的值。如果你使用浮动,那么在某处你会损失一分钱的风险太大。

答案 4 :(得分:0)

我尝试在所有数学运算之前将浮点数乘以100,然后在显示结果之前除以100。 (有效!)

从数学上讲,这就像其他所有人所建议的那样,是“转换为整数”,但是没有任何转换功能,代码看起来更加优雅。另外,为避免混淆,我只在所有值名称的末尾添加了“分”。

从机器的角度来看,使用整数而不是float可能更快,但是编写更易理解的代码是我的首选。 (您的里程可能会有所不同,但在我的应用程序中有效。)