正负浮数加法PHP:返回指数数

问题描述 投票:0回答:2

我有很多数组,其中有一些正数和一些负数,我需要对它们的每个数进行加法运算。如果任何数组具有相同的数字,则应返回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。如果可能的话,有人可以帮助我获得正确的输出并将其四舍五入吗?预先感谢!

php floating-point addition
2个回答
1
投票

指数为-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);
}

Demo

如果要避免这个问题,您将需要四舍五入或确保您使用的数字始终是2的幂的和(因此,分数为0.5、0.25、0.125、0.0625等)。


0
投票

帮助我理解这一点

使用二进制编码的浮点数不能表示精确地数字

''-20.91','-34.48','-5.18','34 .48','20 .91','5.18'

而是使用附近的值。它们的总和约为-3.5527136788005E-15,而不是0。


总和是正确的。计算得出的总和必须为0的期望不是。

© www.soinside.com 2019 - 2024. All rights reserved.