循环增加小数点后第三位php


For loop increasement by 3rd decimal point php

我需要一个循环来将数字增加第三个小数点,打印应该像这个

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。

我错过了什么?

了解浮点数字。基本上,并不是所有的十进制数字都可以精确地用浮点表示。

尝试四舍五入:

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

实时演示

尝试将值四舍五入并将其存储在$i:中

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

这应该适用于您:

(这里我只使用sprintf(),并指定它应该显示小数点后第三位的双精度(lf->longf浮动)

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

如果你想知道为什么会得到这样的结果,看看:浮点数学坏了吗?

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

这是浮点运算工作方式的影响。这可能会导致精度下降。问题是计算中的误差加起来了。因此,一般来说,单靠四舍五入并不安全。它的安全性取决于所做的添加次数,因此取决于这里的迭代次数。。。

尝试一下:

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

上面使用整数计算,下面的除法不会导致错误相加。