如何在PHP中安全地执行与金钱相关的计算?

时间:2009-05-23 02:07:24

标签: php finance

我正在研究一些报告输出脚本,这些脚本需要对一些货币价值做一些基本的计算。

我知道为此目的浮点运算的局限性,但是输入值都是十进制格式,所以如果我在它们上使用算术运算符,PHP会将它们转换为浮点数。

那么处理数字的最佳方法是什么?我应该使用BCMath吗?在.NET中有类似于Decimal的东西吗?或者,如果我强制转换为int,那么使用算术运算符是否安全?

3 个答案:

答案 0 :(得分:11)

不要以美元(1.54美元)工作,以美分工作:(154c)。除非你需要执行几分之一重要的任务,否则你将使用整数,一切都很好。如果你对十分之一美分感兴趣,那么只需将所有东西乘以10!

答案 1 :(得分:9)

如果使用BCMath,所有值都将存储在字符串中并作为字符串传递给函数,就像结果将是一个字符串一样。因此,您不需要进行任何转换,但要确保为函数指定的数字是值数值。就个人而言,如果数学要求小数侧的精度很高,那么使用BCMath。

答案 2 :(得分:-6)

如果你正在使用合理的金额(对于“普通人”),使用浮点不太可能是一个问题,特别是如果你只是增加和减去金额,而不是做利息计算

如果您正在寻找快速解决方案,切换到整数不太可能对您有所帮助;你仍然需要处理溢出。 (有人在这里编辑提到,如果PHP遇到超出整数类型边界的数字,它将是interpreted as a float instead。但是你回到原来使用浮点的问题!)任意长度整数(GMP) ,从该页面引用)可以提供帮助。)

基本上,在大多数情况下,这样做是半工作的,并且很便宜;正确地做是一个严重的痛苦。我的建议是把这看作是一个商业问题:如果有人抱怨错过一分钱,给他们一美元,并且不要打扰真正的解决方案,直到你要通过这样做来节省更多的钱。