对于循环增加3小数点PHP

时间:2015-03-29 18:33:52

标签: php for-loop

我需要一个循环来将数字增加3位小数,并且打印应该如下所示

1.1
1.101
1.102
1.103
...
2.0
2.001
2.002
...
2.1
2.101
...

for ($i = 1.1; $i <= 3; $i += .001){

   echo $i . '<br />';
}

开始似乎没问题 但是在循环的某个地方,十进制数变为大

1.54
1.541
1.542
1.543
1.544
1.545
1.546
1.547
1.548
1.549
1.55
1.551
1.552
1.553
1.554
1.5549999999999
1.5559999999999
1.5569999999999
1.5579999999999
1.5589999999999

如果我使用

number_format($i,3)

我的所有数字都有3个小数点,如

1.100我需要它为1.1。

我错过了什么?

4 个答案:

答案 0 :(得分:2)

读取有关浮点数的信息。基本上,并非所有十进制数都可以用浮点精确表示。

尝试舍入数字:

for ($i = 1.1; $i <= 3; $i += .001){
   echo round($i,3) . '<br />';
}

答案 1 :(得分:1)

Live demo

尝试舍入值并将它们存储在$ i:

for ($i = 1.1; $i <= 3; $i += .001){
    $i = round($i, 3);
   echo $i . '<br />';
}

答案 2 :(得分:1)

这应该适合你:

(这里我只使用sprintf()并指定它应该显示一个双(lf - &gt; l ong f loat)小数点后三位)

echo sprintf("%.3lf", $i) . '<br />';

如果您想知道为什么会得到此结果,请参阅:Is floating point math broken?

BTW:此方法也有副作用,它显示:1.560而不是1.56

答案 3 :(得分:1)

这是浮点运算如何工作的效果。这可能导致精度不高。问题在于计算错误加起来。因此,单独舍入一般不是很安全。它的安全性取决于完成的添加次数,所以这里的迭代次数......

尝试这样的尝试:

for ($i = 1100; $i <= 3000; $i++) {
   echo $i/1000 . "<br>\n";
}

以上使用整数计算,以下除法不会导致累加误差。