0

当您使用 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
4

1 回答 1

2

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

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

浮点数的精度有限。尽管取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于在 1.11e-16 的数量级四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。

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

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

顺便说一句,你的价值

-2.22044604925E-16

实际上是:

-0.000000000000000222044604925

于 2013-09-30T03:23:33.790 回答