具有基本算术运算的 PHP 浮点错误


PHP floating point error with basic arithmetic operation

我是PHP的新手,正在尝试执行简单的算术加法和比较。我有一个带有一些十进制值的数组,将所有值相加后,我试图将其与 1 进行比较。我的数组是:

$myArray=[0.2,0.7,0.1] 

我的代码是:

$sum=0;
foreach($myArray as $val){
    $sum+=$val;             
}

在这里,总和为 1。但是当我使用以下代码比较它时:

if($sum!=1)
{
    echo "Good";
}
else
{
    echo "Bad";
}

它呼应"Good".

但是,当我的数组包含值 0.8 和 0.2 时,它会回显"Bad" 。谁能帮我解决这个问题?

如果你检查PHP文档的浮点数:php.net/manual/en/language.types.float.php,页面上有一个巨大的警告。

"浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入为1.11e-16,这将产生最大的相对误差。非初等算术运算可能会产生更大的误差,当然,当几个运算复合时,必须考虑误差传播。

因此,您可能会得到意外的结果,例如 0.2 + 0.7 = 0.900000000001。这仅仅是因为计算机很难表示小数。二进制实际上是为整数构建的。

小心你的逻辑;我想你的意思是if($sum == 1) echo "Good",等等。在这种情况下,0.2+0.7+0.1 会回显"Bad",因为 0.2+0.7+0.1 = 1.00000001 或 0.999999999 是完全可能的。另一方面,将较少数量的浮点数相加可减小误差,因此 0.8+0.2 比 0.2+0.7+0.1 更精确。