【问题标题】:Positive and Negative floating numbers addition PHP: returning exponential number正负浮点数加法PHP:返回指数数
【发布时间】:2026-02-08 09:40:01
【问题描述】:

我有许多数组,其中包含一些正数和一些负数,我需要将它们的每个数字相加。如果任何数组具有相同的数字,应该返回 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
如果可能的话,有人可以帮我把它四舍五入到2来得到正确的输出吗?

提前致谢!

【问题讨论】:

  • 这是浮点数的本质。您可能会发现 number_format() 功能很有用。
  • number_format() 也不适合我
  • 回显number_format($total, 2) 为您的测试用例生成0.00。由于您的示例数据似乎是两位小数,0.00 是您正在寻找的正确吗?幕后$total 依然是它的原始值。如果你想强制它为零,你可以有一个if 条件。

标签: php floating-point addition


【解决方案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 等)。

【讨论】:

  • 我想添加这些数字。仅仅使用 printf 对我不起作用。
  • 演示帮助我理解了这个问题,以及对 IEEE 浮点算术标准 (IEEE 754) 的参考。谢谢!
【解决方案2】:

帮助我理解这一点

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

'-20.91', '-34.48', '-5.18', '34.48', '20.91', '5.18'

而是使用附近的值。这些总和约为 -3.5527136788005E-15 而不是 0。


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

【讨论】: