为什么结果是这样?-2.22044604925E-16


Why result is that? -2.22044604925E-16

当您使用 range 函数时,范围介于 0 和 1 之间,每一步递增 0.05,当您尝试从 1 减去循环中的当前值时,循环会产生不正确的结果。

正如你在下面看到的,数组中的最后一个元素是整数 1。脚本应回显 1 减 1 的结果。但是,由于某种原因,PHP 将 1-1 视为 -2.22044604925E-16 而不是零。

重现代码:

foreach (range(0,1,0.05) as $t)
    {
    echo (1-$t).'<br />';
    }
Expected result:
----------------
1
0.95
0.9
0.85
0.8
0.75
0.7
0.65
0.6
0.55
0.5
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
0
Actual result:
--------------
1
0.95
0.9
0.85
0.8
0.75
0.7
0.65
0.6
0.55
0.5
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
-2.22044604925E-16
任何在

PHP 中具有小数位的数字都被视为浮点数。现在,你或我可能认为浮点数和小数非常准确 - 对我们来说,0.1 只是意味着 0.1 - 但对于 PHP 可能会显示 0.1,但在后台,它实际上认为它是

0.1000000000000000000000001。

这与浮点精度有关。 上面有一个很大的警告:

浮点数的精度有限。虽然它取决于 该系统,PHP通常使用IEEE 754双精度格式, 由于订单中的四舍五入,这将给出最大的相对误差 的 1.11e-16。非初等算术运算可能会给出更大的 错误,当然,在以下情况下必须考虑错误传播 几个操作是复合的。

简短的版本是 -2.22044604925E-16 与 PHP 理解的几乎为零,但在此过程中的某个地方,它失去了它正在做的事情的准确性并提出了错误的答案。

这是相同的问题,几乎涵盖了所有没有整数或固定十进制数据类型的系统。例如,查看具有整数类型,定点类型(均标记为EXACT Values(的mySQL数据类型,最后标记为近似类型的浮点数。

顺便说一下,你的价值

-

2.22044604925E-16

实际上是:

-

0.0000000000000000222044604925