当我在eclipse中执行下面的代码时,结果不是0但是5.5511151231258E-17
$a = 0.1+0.2-0.3;
echo $a;
有人可以告诉我为什么吗?
答案 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。