为什么带有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
)
答案 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}}