回 帖 发 新 帖 刷新版面

主题:哪位高手帮看下这个程序问题出在哪,谢谢!

#include <stdio.h>
void main()
{
double a,b,c,d,e,q,g,h;
scanf("%lf%lf%lf",&a,&b,&c);
d=(a+b+c)/3;
e=10*d,q=e+0.5;
g=(int)(q),h=g/10;
printf("%f,%f,%f\n",q,g,h);
}
我是刚刚开始学C语言,编写程序时运行没有发现错误和警告,但输出时却发现,q值变化异常,
进行强制类型转换后出现问题.变小了许多,不再是正常的强制类型转换.
谁可以帮一我,告诉我问题到底出在哪?

回复列表 (共11个回复)

沙发

有问题么?你是不是计算器打错了……

板凳

我在电脑上运行了一下,没发现问题啊

3 楼

输入:
1 2 3
输出:
20.500000,20.000000,2.000000

4 楼

的确是有问题呀,如果你输入 6  1 0.35
输出的是:25.000000,24.000000,2.400000
这时会发现, q值是25,对进行强制类型转换后得到的g却成了24,不是很奇怪吗?

5 楼

[quote]的确是有问题呀,如果你输入 6  1 0.35
输出的是:25.000000,24.000000,2.400000
这时会发现, q值是25,对进行强制类型转换后得到的g却成了24,不是很奇怪吗?[/quote]

果然是啊,我也不知为何会这样
 楼主的发现引起我的兴趣……

6 楼

这么和你说吧

你的例子里,q并不等于25(其实q等于24.999999999999996),只是%f输出的时候,默认取了6位小数,四舍五入之后变成了25.000000。

而(int)强制转换之后,就把小数部分舍弃掉了,g就成了24.0。

测试的时候可以考虑改成long double,以免精度问题引起误差

7 楼

#include <stdio.h>
void main()
{
double a,b,c,d,e,q,g,h;
scanf("%lf%lf%lf",&a,&b,&c);
d=(a+b+c)/3;
e=10*d,q=e+0.5;
g=(int)(q),h=g/10;
printf("%f,%d,%f\n",q,g,h);
getch();
}
你这个代码本身就没问题,你自己输入数字后算一下就可以啦!!在最后加一个getch()这样输出的时候就不会只是闪一下就没啦!!!你自己运行试试看吧

8 楼

对于7楼 James.Jiang .不好意思问一下,你改后的代码真的没问题吗,好像我运行出了错误,其实我学C语言到今天为止才3天,好多东西都没学到.
而6楼作者:argentmoon,你说得好像有道理,但 q 等于24.999999999999996,这个怎么算的?说测试用 long double, 是在定义那里吗,我试过,好像那也不能解决问题呀?能说明确点吗?

9 楼

浮点数对于很多数都无法精确表示。楼主真要是感兴趣可以看看浮点数格式:)

10 楼

[quote]对于7楼 James.Jiang .不好意思问一下,你改后的代码真的没问题吗,好像我运行出了错误,其实我学C语言到今天为止才3天,好多东西都没学到.
而6楼作者:argentmoon,你说得好像有道理,但 q 等于24.999999999999996,这个怎么算的?说测试用 long double, 是在定义那里吗,我试过,好像那也不能解决问题呀?能说明确点吗?[/quote]


不是算的,是通过调试看,或者打印出来看也可以,

比如你可以把输出语句改成:
printf("%.16f,%f,%f\n",q,g,h);    // q保留16位小数

对你这个例子应该是可以正常显示的。

另外,long double是一种类型,比double精度更高的浮点数格式类型。感兴趣的话可以搜索一下。

我来回复

您尚未登录,请登录后再回复。点此登录或注册