2 qq 23373117 qq_23373117 于 2015.07.21 16:00 提问

下面一个程序,为什么输出次序颠倒了

#include
int main(void)
{
double i;

for(i=0;i<=10.1;i+=0.1)
{
    printf("%.1lf\n",i);
    printf("%lf\n",i);
    printf("%d\n",(int)i);

    if(i>=9.9)
        break;
}
return 0;

}
除了次序颠倒的问题外,还想问一下,比如i==1.199999,在此程序以double输出时却变成了1.100000
次序颠倒的问题的话,说的详细点吧,程序运行后的输出是%lf,%d,%.1lf
也就是先第二句printf("%lf\n",i)输出,接着第三句,然后才是第一句

2个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.07.21 16:08
已采纳

输出次序颠倒?没明白
别用浮点或者双精度类型做步长,不准确的。不是你想象的每次刚好加0.1

danielinbiti
danielinbiti 回复qq_23373117: 就因为位数和精度不一样。所以尽量还是用定义的,不然很容易出错读到内存外
2 年多之前 回复
qq_23373117
qq_23373117 回复danielinbiti: 我想了想,试了试,觉得是这样,输出时,%lf和%f好像是完全一样的,都输出六位小数,都四舍五入,要是想再提高精度,都可以%.xlf或者%.xf,x>6,其输出结果也是一样的,也就是此处%f尽管是float的输出,但是也可以输出六位以后的小数
2 年多之前 回复
danielinbiti
danielinbiti 回复qq_23373117: double用lf,float用f,http://zhidao.baidu.com/link?url=7flNaenQ9DnqykBxI2683s27u_XiMsTnQ7d0eWjOR7FqXKbvaw5bTaodROvI4tYF2-GMStQI7eB9VNZE-up_AK如果有帮助,有时间记得顺手采纳一下。
2 年多之前 回复
qq_23373117
qq_23373117 回复danielinbiti:谢谢, 这个我现在明白了,但是还想麻烦你请教一下,输出的时候%lf和%f是不是没有区别,都是保留六位小数,都是四舍五入,我说的是输出的时候是不是没有区别,不考虑输入
2 年多之前 回复
danielinbiti
danielinbiti 回复qq_23373117: %lf保留6位小数,四舍五入,如果是1.1999999999,则保留后是1.200000
2 年多之前 回复
qq_23373117
qq_23373117 回复danielinbiti: 调试的时候,所有数的后五位都不是0,几乎全是9,但是输出每个数的后五位都变成了0,应该不是凑巧全0的情况
2 年多之前 回复
danielinbiti
danielinbiti 回复qq_23373117: 既然是不确定,也可能存在刚好都是0的情况,也不是说都完全不一致。只是存在不准确,而不是一定不准确
2 年多之前 回复
qq_23373117
qq_23373117 回复danielinbiti: 少年你真机智啊!我明白了,但是还有一个问题就是像你所说的吧,步长不准确,这我知道,所以应该后来的i的小数点后6位除第一位外其余五位的值应该不确定,但是以%lf输出时,那不确定的五位统一以0填充了,这是为什么啊
2 年多之前 回复
danielinbiti
danielinbiti 回复qq_23373117: 屏幕输出就这么大,多了前面自动往上滚动,看不见了。
2 年多之前 回复
qq_23373117
qq_23373117 回复danielinbiti: 诶?你说的第一个a被刷掉了,好像就是这个原因!但是为什么会被刷掉呢,不太懂
2 年多之前 回复
danielinbiti
danielinbiti 回复qq_23373117: for(i=0;i<=10.1;i+=0.1)改成for(i=0;i<=0.2;i+=0.1),输出结果减小。
2 年多之前 回复
danielinbiti
danielinbiti 回复qq_23373117: 你确定不是因为屏幕输出滚屏到时第一个a被刷掉了?
2 年多之前 回复
qq_23373117
qq_23373117 回复danielinbiti: 不信你编译试试嘛,找你说的,也是出现b,c,a,b,c,a........
2 年多之前 回复
danielinbiti
danielinbiti 回复qq_23373117: 不可能会颠倒呀,你成printf("a%.1lf\n",i); printf("b%lf\n",i); printf("c%d\n",(int)i);,加上a,b,c,你看看输出有没有颠倒
2 年多之前 回复
qq_23373117
qq_23373117 次序颠倒的问题的话,说的详细点吧,程序运行后的输出是%lf,%d,%.1lf 也就是先第二句printf("%lf\n",i)输出,接着第三句,然后才是第一句
2 年多之前 回复
c1159225982
c1159225982   2015.07.21 16:07

这是因为double的范围限制,如果是上面那个数值的话可能出界造成的

qq_23373117
qq_23373117 次序颠倒的问题的话,说的详细点吧,程序运行后的输出是%lf,%d,%.1lf 也就是先第二句printf("%lf\n",i)输出,接着第三句,然后才是第一句
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片