我需要一个循环来将数字增加第三个小数点,打印应该像这个
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";
}
上面使用整数计算,下面的除法不会导致错误相加。