C程序问题,读入三个双精度数求它们平均值并保留此平均值小数点后一位,对小数点后第二位小数四舍五入

#include "stdio.h"
main()
{
double a,b,c,d;
printf("输入三个双精度数:");
scanf("%lf%lf%lf",&a,&b,&c);
d=(a+b+c)/3;
d*=10;
d+=0.5;
d/=10;
printf("%.1lf\n",d);
}
这个程序是正确的程序,就是看不懂。d*=10和d+=0.5和d/=10是什么意思?只看得懂d=(a+b+c)/3是求平均数。还有双精度数就是小数点后有两个小数的数么?初学菜鸟,来个大神给讲讲吧谢谢啦!!!

单精度实数在内存中占32bit 有效数字为6~7位,
双精度实数占内存单元为64bit 有效数字为15~16位。
所以双精度数不是小数点后有两个小数的数。

d*=10;
d+=0.5;
d/=10;
这三条语句是对小数点后第二位小数四舍五入。
例如d=1.26;
d*=10; // 12.6
d+=0.5; //13.1
d/=10; //1.31
printf("%.1lf\n",d); // 1.3

很明显,若小数点后第二位小数大于等于5,就会往前一位进位。就是四舍五入了。其实
d+=0.05;
就能实现了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-08-03
/*读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。*/

#include
#include
void main()
{
double a,b,c,d,e;
int g,h1,h2;
char f[20];
printf("请输入三个双精型\n");
scanf("%lf %lf %lf",&a,&b,&c);
d=(a+b+c)/3;
printf("原来未按要求执行返回的双精型\n");
printf("%lf\n",d);
e=d-(int)d; /*求小数部分*/
sprintf(f,"%f",e);/* 将小数转换成字符串*/
printf("转换成字符串之后的小数部分\n");
printf("%s\n",f);/*这一步是用来检测字符串是怎样的*/
g=strlen(f); /*计算字符串长度*/
printf("字符串长度:%d\n",g);
if(g>=3)
{
printf("处理好之后的平均值是\n");
h2=(int)f[3]; /* f[3]是字符型数据,强行取整之后,编程ASC值*/
if(h2>52) /*判断ASC码 4*/
{
h2=(int)f[2];
if(h2>56)
{
h2=48; /*进位直接写0的ASC码*/
h1=(int)d;
h1=h1+1;
}
else
{
h2=h2+1;
h1=(int)d;
}
/*转换成字符串之后一个个字符输出,好笨的办法,求大神精辟*/
printf("%d",h1);/*这里是取双精型的整,不用输出字符*/
printf("%c",f[1]);
printf("%c",h2); /*h2是取ASC码的值,所以要输出字符型数据*/
}
else{
printf("%d",h1=(int)d);
printf("%c",f[1]);
printf("%c",f[2]);}
printf("\n");

}
else{
printf("处理好之后的平均值是\n");
printf("%g\n",d);
}

}