为什么PHP为(89.99 * 12) - 1079.88计算-2.27373675443E-13?

时间:2012-06-25 11:51:14

标签: php floating-point

  

可能重复:
  php calculate float
  The accuracy of PHP float calculate

为什么PHP为此计算-2.27373675443E-13 ...

echo  (89.99*12) - 1079.88;

不应该返回0?

1 个答案:

答案 0 :(得分:4)

floating point计算很复杂且可能不准确。这个问题出现在每种编程语言中,因为十进制数字不能完美地存储在二进制表示中。

引用PHPs documentation about this

  

警告
  浮点精度

     

浮点数的精度有限。虽然这取决于   在系统中,PHP通常使用IEEE 754双精度格式,   由于订单的舍入,这将产生最大的相对误差   1.11e-16。非基本算术运算可能会更大   错误,当然,必须考虑错误传播   几个操作复杂化。

     

此外,有理数的数字可以完全表示为   基数10中的浮点数,如0.1或0.7,没有   精确表示为基数2中的浮点数,即   内部使用,无论尾数的大小。因此,他们   没有a就无法转换成它们的内部二进制对应物   精度损失小。这可能导致令人困惑的结果:for   例如,floor((0.1 + 0.7)* 10)通常会返回7而不是   预期8,因为内部表示将是类似的   7.9999999999999991118 ....

     

所以永远不要将浮动数字结果信任到最后一位数,而不是   直接比较浮点数是否相等。如果更高   精度是必要的,任意精度数学函数和gmp   功能可用。