PHP给出8.8817841970013E-016而不是0

时间:2013-03-04 07:39:10

标签: php floating-point

我在PHP中进行简单的计算。

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

PHP将8.8817841970013E-016作为答案而不是零。

我尝试过round,number_format这样的函数,但仍然得到相同的结果

4 个答案:

答案 0 :(得分: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文档站点上找到了a page with more info

答案 1 :(得分:2)

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

如果你想深入研究为什么会这样,http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html上有一篇很棒的文章(但要注意,它很深:) :)

答案 2 :(得分:0)

试试这个

round(2.70 + 2.30 + 29.70 - 2.30 - 29.70 - 2.70)

答案 3 :(得分:0)

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

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

我建议阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic