解决精度问题
以一道题为例
求以下三数的和,保留2位小数 1~a之和 1~b的平方和 1~c的倒数和
样例输入:
100 50 10
样例输出:
47977.93
注意:
- 结果有小数部分
- 小数要保留两位
- 要解决相应的精度问题
解决办法
1.小数
使用浮点型数据,哪个数有小数,就要定义成浮点型。
2.小数点后的位数
%.2f 即可解决
3.精度问题
注意数据运算的格式,有小数点的要加上小数点
错误的代码
#include<stdio.h>
int main()
{
int a,b,c,i;
double s=0.00;
scanf("%d%d%d",&a,&b,&c);
for (i=1;i<=a;i++)
s += i;
for (i=1;i<=b;i++)
s += i*i;
for (i=1;i<=c;i++)
s += 1/i;//错误之处
printf("%.2lf",s);
}
改正后的代码
#include<stdio.h>
int main()
{
int a,b,c,i;
double s=0.00;
scanf("%d%d%d",&a,&b,&c);
for (i=1;i<=a;i++)
s += i;
for (i=1;i<=b;i++)
s += i*i;
for (i=1;i<=c;i++)
s += 1.0 /i;//改正之后的
printf("%.2lf",s);
}
不难看出,仅仅把分子改成小数类型,就是正确结果。
其实,除法运算往往能够出现小数,因此要保证分子是小数,结果才能保留小数部分。
思考
在以后的C语言编程中,要时刻注意:
1.结果有小数,一定要注意一下
- 变量是否定义成浮点型或double型
- 除法运算的分子或分母是否加了小数点(一般针对固定的常数)
2.变量的初始化
- 出现累加或者累乘时,和的变量 或 积的变量要进行初始化,如果没有,结果往往不尽人意
- 大项目里出小错,往往很难发现。我就是花费了好长时间才找出来。因此以后要养成好的习惯,不要因小失大。
总结:
- 在除数和被除数都是int型时,除法(/)默认会进行取整操作,将小数部分截掉。
- 如果要保留小数,需要让除数或者被除数两者任一个有小数位,才会使结果出现小数。
- double 和 int 运算结果自动为double型,float 和 int 运算结果为float。也就是占字节数小的数据类型会自动转化为占字节大的数据类型。