关于perl编程的一个for循环问题
for($i=0.5;$i<=1.6;$i=$i+0.1){print"$i\n";}程序如上,打印结果为什么只到1.5呢,好奇怪...
for ($i=0.5;$i<=1.6;$i=$i+0.1)
{
print "$i\n";
}
程序如上,打印结果为什么只到1.5呢,好奇怪 展开
{
print "$i\n";
}
程序如上,打印结果为什么只到1.5呢,好奇怪 展开
1个回答
展开全部
是由于浮点数的精度问题造成的,算到1.6的时候,实际得到的值约等于1.60000000000000030,比1.6要稍微大那么一点点,所以1.6 不会输出。
你可以在循环后面加上下面这一行,输出 $i 后面的17位小数:
print sprintf("%.17f\n", $i);
当然你也可以把它放进循环里面,看一下变量 $i 的 实际变化情况:
0.50000000000000000
0.59999999999999998
0.69999999999999996
0.79999999999999993
0.89999999999999991
0.99999999999999989
1.09999999999999990
1.20000000000000000
1.30000000000000000
1.40000000000000010
1.50000000000000020
1.60000000000000030
最后,如果你想用 perl 进行高精度计算,可以看一下 CPAN 上 Math::BigInt, Math::BigFloat 等模块,使用这些模块能够有效规避类似问题。
你可以在循环后面加上下面这一行,输出 $i 后面的17位小数:
print sprintf("%.17f\n", $i);
当然你也可以把它放进循环里面,看一下变量 $i 的 实际变化情况:
0.50000000000000000
0.59999999999999998
0.69999999999999996
0.79999999999999993
0.89999999999999991
0.99999999999999989
1.09999999999999990
1.20000000000000000
1.30000000000000000
1.40000000000000010
1.50000000000000020
1.60000000000000030
最后,如果你想用 perl 进行高精度计算,可以看一下 CPAN 上 Math::BigInt, Math::BigFloat 等模块,使用这些模块能够有效规避类似问题。
追问
原来如此啊,试了一下确实是浮点数精度问题,太感谢了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询