保留小数问题
在C语言中我们可以直接利用printf()的特质进行小数的保留,首先目标值应当为一个浮点数类型, 以double类型为例 "% .(这里有个点)n(指的是要保留的位数)lf"
printf("%.1lf\n",a);//指的是保留一位小数
printf("%.2lf\n",a);//指的是保留两位小数
保留小数所使用的printf函数还是比较复杂(bushi),在sacnf函数中,还会存在读取宽度问题
int a = 123;
printf("%6d",a);
此时的printf就需要读取到6位a仅有三位剩余的三位就由空格补齐,这时就出现了问题:空格补在哪里,上例中空格就直接补在了右边(默认右对齐)。左对齐则需要“-”加在数字n的左边如下:
printf("%-6d",a);
此时变为左对齐
保留有效数字问题
同样以double类型为例,"% . n (指的是要保留的位数)g(保留有效数字的符号)"
printf("%.1g\n",a);//指的是保留一位有效数字
printf("%.2g\n",a);//指的是保留两位有效数字
在一些问题中可能会遇见一些麻烦,比如我刚刚遇见的。
我给出的代码是
#include
int main()
{
int n=0,k=0,count1=0,count2=0,,sum1=0,sum2=0;
double A=0,B=0;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
if(i%k==0)
{
count1++;
sum1+=i;
}
else
{
count2++;
sum2+=i;
}
}
A=sum1/count1;
B=sum2/count2;
printf("%.1lf %.1lf",A,B);
return 0;
}
但是得不到正确的答案
其原因在于整数除法运算结果先去尾再转换为浮点。
将sum也定义为double类型
正确答案是
#include
int main()
{
int n=0,k=0,count1=0,count2=0;
double A=0,B=0,sum1=0,sum2=0;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
if(i%k==0)
{
count1++;
sum1+=i;
}
else
{
count2++;
sum2+=i;
}
}
A=sum1/count1;
B=sum2/count2;
printf("%.1lf %.1lf",A,B);
return 0;
}
总结:保留小数的除法计算应将除数,被除数,结果均定义为double类型,因为整形的除法运算先去尾再转化为浮点型