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

Cru*_*aft 32 php types decimal

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

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

另一种方法是将整个事物存储为整数数据类型中的分数,另外还记得在我使用数据库的任何时候来回转换(mysql,我使用的是十进制数据类型).imho,Inelegant,以及许多错误陷阱.

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

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

Ran*_*Dev 26

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

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

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

  • PHP有一组专门用于操作和比较精度数字的函数:http://www.php.net/manual/en/ref.bc.php (11认同)

Den*_*ink 6

2016 年更新:

我绝对不建议再将“钱”存储为整数。唯一正确的答案是Andrew Dunn的:使用Mysql的DECIMAL类型并将php的bc_*函数封装在Currency类中。


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

您应该始终使用整数。将值作为整数存储在数据库中,使用整数进行计算,并且当且仅当您想要打印它时,将其转换为某种可读格式。

这样你就可以完全规避浮点问题,这通常是处理金钱时的一个大问题;)

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

  • MySQL 和其他数据库具有 DECIMAL / NUMERIC 格式,该格式是专门为规避浮点问题并给出准确结果而设计的。 (3认同)
  • 我认为是讽刺,所以我没有投票反对你。请确认我是对的:) (3认同)

Cru*_*aft 0

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

  • 这不是简单的最佳做法和非常糟糕的建议.请务必封装使用任意精度数学函数的函数,但请不要遵循上面的建议.最好的答案是Andrew Dunn. (6认同)