查看此链接的输出(向下滚动以查看输出),找出我想要完成的任务
问题在于9-11线上的for
循环。
for(i=0; i<=0.9; i+=0.1){
printf("%6.1f ",i);
}
我期望这个值从0.0到0.9之间,但是它在打印0.8之后就停止了,知道为什么吗?
发布于 2014-01-24 20:09:36
在这里使用浮点数是问题的根源。相反,使用int来实现它:
int i;
for(i = 0; i <= 10; i++)
printf("%6.1f ", (float)(i / 10.0));
输出:
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
发布于 2014-01-24 20:19:24
理想情况下,浮点不应用于迭代,但如果您想知道为什么要更改代码并查看如何更改代码。
for(float i=0; i<=0.9f; ){
i+=0.1f;
System.out.println(i);
}
这是结果。
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
你的第九个数值超过0.9。
发布于 2014-01-24 20:20:11
浮点算法在计算中是不精确的。这是因为计算机表示浮点值的方式。以下是MSDN关于这一主题的文章的摘录:
每个十进制整数都可以精确地由二进制整数表示;但是,对于小数来说,这并不是>正确的。事实上,在基数小于10的任何系统中,基10中的每个非理性数也都是>非理性的。 特别是对于二进制,只有p/q形式的小数,>q是2的整数幂,才能用有限的位数精确表示。 即使是常见的十进制分数,如小数点0.0001,也不能精确地用>二进制表示。(0.0001是一个周期为104位的重复二进制分数!)
https://stackoverflow.com/questions/21341496
复制相似问题