Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中安全地执行与金钱相关的计算?_Php_Finance - Fatal编程技术网

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

如何在PHP中安全地执行与金钱相关的计算?,php,finance,Php,Finance,我正在编写一些报表输出脚本,这些脚本需要对一些货币值进行一些基本计算 我知道浮点运算在这方面的局限性,但是输入值都是十进制格式的,所以如果我对它们使用算术运算符,PHP会将它们转换为浮点 那么,处理这些数字的最佳方法是什么?我应该使用吗?在.NET中有类似的东西吗?或者如果我回溯到int,使用算术运算符是否安全?如果使用BCMath,所有值都将存储在字符串中,并作为字符串传递给函数,就像结果是字符串一样。因此,您无需执行任何强制转换,只需确保给定给函数的数字是数值。就个人而言,如果数学要求小数点

我正在编写一些报表输出脚本,这些脚本需要对一些货币值进行一些基本计算

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


那么,处理这些数字的最佳方法是什么?我应该使用吗?在.NET中有类似的东西吗?或者如果我回溯到int,使用算术运算符是否安全?

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

不要用美元($1.54)计算,用美分计算:(154c)。除非您需要执行分数很重要的任务,否则您将使用整数,一切正常。如果你对十分之一美分感兴趣,那就把所有的东西都乘以十吧

如果你(对一个“正常人”)处理的是合理的金额,那么使用浮点不太可能是一个问题,特别是如果你只是对金额进行加减,而不是进行利息计算

如果您正在寻找一个快速解决方案,切换到integer可能对您没有帮助;您仍然需要处理溢出问题。(有人在这里编辑说,如果PHP遇到一个超出整数类型界限的数字,它将是。但是,你又回到了使用浮点的原始问题!)任意长度的整数(GMP,从该页引用)可能会有所帮助。)


基本上,这种半途而废的做法在大多数情况下都有效,而且成本低廉;正确地做这件事是一件非常痛苦的事。我的建议是将这视为一个商业问题:如果有人抱怨少了一分钱,给他们一美元,在你打算通过这样做节省更多的美元之前,不要麻烦开始真正的解决方案。

要转换一种货币,银行会给我们提供8位小数的利率。那么展示一下怎么样?它仍然需要显示为1.54美元。有没有一种情况下浮点数的结果是1.53或1.55?只需使用包装函数:displayMoney($value){echo'$。$value*100;}肖恩:不,关键是不管编程语言如何,都不应该使用浮点数。我在这个解决方案中发现的一个问题是,在处理税收或折扣时。你仍然需要乘以一个浮点数。在使用ints时,您将如何解决这个问题?这就是Cobol在金融领域仍然大量使用的原因。你可以很容易地使用小数,这是错误的。浮点不能表示所有以10为基数的数字。即使使用小数字和简单的加法/减法,也可能得到不正确的结果。四舍五入的浮点数可以表示0.01到1.00之间的所有数字(注意此处的有效数字)。