为什么0.1 + 0.2-0.3 = 5.5511151231258E-17在php中

时间:2011-08-25 05:24:44

标签: php floating-point precision

  

可能重复:
  The accuracy of PHP float calculate

当我在eclipse中执行下面的代码时,结果不是0但是5.5511151231258E-17

$a = 0.1+0.2-0.3;
echo $a;

有人可以告诉我为什么吗?

4 个答案:

答案 0 :(得分:7)

这是因为浮点数的精度有限

您可以在this page in the PHP manual上找到有关此特征的更多信息。

  

浮点数的精度有限。虽然这取决于   在系统中,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函数   可用。

请注意,这不是特定于PHP的特性; it is just the way floating point numbers work

答案 1 :(得分:1)

你正在使用PHP的floating point precision issues。所有语言都有它们,你刚刚发现了PHP。

答案 2 :(得分:1)

这不是特定于PHP的,正如其他人所提到的那样。但是,您可以使用round():

来避免有限的浮点精度
<?php
$a = 0.1+0.3-0.2;
echo round($a, 2);
?>

当然,您需要事先了解位数。

答案 3 :(得分:0)

这是因为计算机无法准确表示浮点数。这不是特定于PHP。

有关详细信息,请参阅here