我正在研究一些需要对一些货币价值进行基本计算的报告输出脚本。
我知道为此目的浮点算术的局限性,但是输入值都是十进制格式,所以如果我对它们使用算术运算符,PHP 会将它们转换为浮点数。
那么处理数字的最佳方法是什么?我应该使用BCMath吗?.NET 中是否有类似于Decimal的东西?或者如果我转换回 int,使用算术运算符是否安全?
我正在研究一些需要对一些货币价值进行基本计算的报告输出脚本。
我知道为此目的浮点算术的局限性,但是输入值都是十进制格式,所以如果我对它们使用算术运算符,PHP 会将它们转换为浮点数。
那么处理数字的最佳方法是什么?我应该使用BCMath吗?.NET 中是否有类似于Decimal的东西?或者如果我转换回 int,使用算术运算符是否安全?
不要以美元(1.54 美元)工作,以美分工作:(154c)。除非您需要执行重要的任务,否则您将使用整数并且一切都很好。如果您对十分之一美分感兴趣,那么只需将所有内容乘以十!
如果您使用 BCMath,所有值都将存储在字符串中并作为字符串传递给函数,就像结果将是一个字符串一样。因此,您不需要进行任何转换,但要确保给函数的数字是值数值。就个人而言,如果数学需要小数点的高精度,那么使用 BCMath。
如果您使用合理的金额(对于“普通人”),使用浮点可能不是问题,特别是如果您只是添加和减去金额,而不是进行利息计算。
如果您正在寻找快速解决方案,切换到整数不太可能对您有所帮助;你仍然必须处理溢出。(有人在这里编辑提到,如果 PHP 遇到超出整数类型范围的数字,它将被解释为浮点数。但是你又回到了使用浮点数的原始问题!)任意长度整数(GMP ,从该页面引用)可以提供帮助。)
基本上,在大多数情况下,以半途而废的方式这样做是可行的,而且很便宜。正确地做是一种严重的痛苦。我的建议是将其视为一个商业问题:如果有人抱怨少了一分钱,给他们一美元,不要费心开始真正的解决方案,直到你这样做可以节省更多的钱。