主题:哪位高手帮看下这个程序问题出在哪,谢谢!
pyjh136
[专家分:0] 发布于 2011-10-22 21:28:00
#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个回复)
沙发
smartshallot [专家分:0] 发布于 2011-10-22 22:19:00
有问题么?你是不是计算器打错了……
板凳
buctx982zz21 [专家分:0] 发布于 2011-10-23 00:02:00
我在电脑上运行了一下,没发现问题啊
3 楼
buctx982zz21 [专家分:0] 发布于 2011-10-23 00:05:00
输入:
1 2 3
输出:
20.500000,20.000000,2.000000
4 楼
pyjh136 [专家分:0] 发布于 2011-10-23 13:52:00
的确是有问题呀,如果你输入 6 1 0.35
输出的是:25.000000,24.000000,2.400000
这时会发现, q值是25,对进行强制类型转换后得到的g却成了24,不是很奇怪吗?
5 楼
xiaowei00xiaowei [专家分:0] 发布于 2011-10-23 19:15:00
[quote]的确是有问题呀,如果你输入 6 1 0.35
输出的是:25.000000,24.000000,2.400000
这时会发现, q值是25,对进行强制类型转换后得到的g却成了24,不是很奇怪吗?[/quote]
果然是啊,我也不知为何会这样
楼主的发现引起我的兴趣……
6 楼
argentmoon [专家分:13260] 发布于 2011-10-23 23:43:00
这么和你说吧
你的例子里,q并不等于25(其实q等于24.999999999999996),只是%f输出的时候,默认取了6位小数,四舍五入之后变成了25.000000。
而(int)强制转换之后,就把小数部分舍弃掉了,g就成了24.0。
测试的时候可以考虑改成long double,以免精度问题引起误差
7 楼
James.Jiang [专家分:0] 发布于 2011-10-24 16:49:00
#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 楼
pyjh136 [专家分:0] 发布于 2011-10-25 00:13:00
对于7楼 James.Jiang .不好意思问一下,你改后的代码真的没问题吗,好像我运行出了错误,其实我学C语言到今天为止才3天,好多东西都没学到.
而6楼作者:argentmoon,你说得好像有道理,但 q 等于24.999999999999996,这个怎么算的?说测试用 long double, 是在定义那里吗,我试过,好像那也不能解决问题呀?能说明确点吗?
9 楼
cgl_lgs [专家分:21040] 发布于 2011-10-25 11:04:00
浮点数对于很多数都无法精确表示。楼主真要是感兴趣可以看看浮点数格式:)
10 楼
argentmoon [专家分:13260] 发布于 2011-10-25 12:58:00
[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精度更高的浮点数格式类型。感兴趣的话可以搜索一下。
我来回复