为什么浮动步骤不要做最后一次迭代?

时间:2015-12-16 14:22:43

标签: php

为什么带有float步(0.1)的for循环不执行PHP中的最后一次迭代 - 任何版本?

我的测试代码:

$procents_list = [];

for($i = 0.5; $i <= 1.5; $i += 0.1)
{
    $procents_list[] = $i;
}

print_r($procents_list);

从步骤1的5到15的迭代都可以。 为什么打印:

Array
(
    [0] => 0.5
    [1] => 0.6
    [2] => 0.7
    [3] => 0.8
    [4] => 0.9
    [5] => 1
    [6] => 1.1
    [7] => 1.2
    [8] => 1.3
    [9] => 1.4
)

1 个答案:

答案 0 :(得分:2)

计算机使用Base-2(0,1)代替Base-10(0,1,2,... 9)来表示数字。在Base-10中,有些数字无法准确表示(如1/3 = 0.33333)。在Base-2中,无法准确表示不同的数字集。事实上,1/10,十进制为0.1,在二进制中没有精确的表示。因此,使用浮点数的数学可以做奇怪的事情,不应该被视为精确值。

我无法弄清楚如何让PHP打印出所有数字而不进行舍入,但在Java中编写相同的示例会打印出以下值:

$procents_list = [];

for ($i = 5; $i <= 15; $i += 1)
{
    $procents_list[] = $i / 10;
}

print_r($procents_list);

因此,您获得的值略大于1.5,因此循环结束。

在这种情况下,一种替代方法是在循环中使用整数,并在将它们放入数组时除以10:

{{1}}