我需要一个循环来将数字增加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。
我错过了什么?
答案 0 :(得分:2)
读取有关浮点数的信息。基本上,并非所有十进制数都可以用浮点精确表示。
尝试舍入数字:
for ($i = 1.1; $i <= 3; $i += .001){
echo round($i,3) . '<br />';
}
答案 1 :(得分:1)
尝试舍入值并将它们存储在$ 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";
}
以上使用整数计算,以下除法不会导致累加误差。