0

我正在用 PHP 做一个简单的计算。

(2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70)- 从数据库中获取这些数据

PHP 给出8.8817841970013E-016的答案不是零。

我已经尝试过类似 round、number_format 的函数,但仍然得到相同的结果

4

4 回答 4

2

表达式的十进制表示为“0.00000000000000088817841970013”。这是一个非常接近 0 的值,因为在计算机上使用浮点数进行计算时存在标准问题。

如果您想深入了解为什么会这样,可以在http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html找到一篇很棒的文章(但要注意,它很深 :) )

于 2013-03-04T07:47:02.830 回答
2

浮点运算可能会导致某些数字不准确。

如果你想做这样没有这些错误的算术(它是货币吗?),试着把它们作为整数,最后除以 100:

php > echo (270 + 230 + 2970 + -230 + -2970 + -270)/100;
0

如果它实际上是货币,则将它们存储DECIMAL在数据库中并让数据库进行数学运算。

此外,round应该可以正常工作:

php > echo 2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70;
6.2172489379009E-15
php > echo round(2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70);
0

我还从 PHP 文档站点找到了一个包含更多信息的页面。

于 2013-03-04T07:44:46.750 回答
0

从问题中数字的外观来看,这可能是精确处理小数点后两位数的小数很重要的情况。如果是这样,请考虑以百分之几为单位工作。例如,美国货币可以被视为整数的美分,而不是小数点后两位的美元数量。

您仍然可以使用正常的数字解析,但是一旦您得到数字乘以 100 并四舍五入到最接近的整数。同样,输出除以 100 并格式化为两位小数。对整数值进行中间计算。

我建议阅读每个计算机科学家应该知道的关于浮点运算的知识

于 2013-03-04T09:53:42.963 回答
0

尝试这个

round(2.70 + 2.30 + 29.70 - 2.30 - 29.70 - 2.70)
于 2013-03-04T07:43:50.327 回答