我有很多数组,其中有一些正数和一些负数,我需要对它们的每个数进行加法运算。如果任何数组具有相同的数字,则应返回0,但它返回的是指数数据。
$arr=[
'-20.91',
'-34.48',
'-5.18',
'34.48',
'20.91',
'5.18'
];
$total = 0;
foreach($arr as $ar){
$total+=$ar;
}
echo $total;
此代码应给我输出为0,但返回-3.5527136788005E-15如果我写
echo round($total);
它显示-0。如果可能的话,有人可以帮助我获得正确的输出并将其四舍五入吗?预先感谢!
指数为-15,数字小得令人难以置信,是对数字的IEEE floating point表示进行四舍五入的结果。
要了解问题所在,可以检查此代码示例:
<?php
$arr=[
'-20.91',
'-34.48',
'-5.18',
'34.48',
'20.91',
'5.18'
];
foreach ($arr as $float) {
printf("%.30f\n", (float)$float);
}
如果要避免这个问题,您将需要四舍五入或确保您使用的数字始终是2的幂的和(因此,分数为0.5、0.25、0.125、0.0625等)。
帮助我理解这一点
使用二进制编码的浮点数不能表示精确地数字
''-20.91','-34.48','-5.18','34 .48','20 .91','5.18'
而是使用附近的值。它们的总和约为-3.5527136788005E-15,而不是0。
总和是正确的。计算得出的总和必须为0的期望不是。