我是在做HDU一直WA,AC后,无意发现的结论。
下面请看:
先上测试代码:
#include<stdio.h>
int main()
{
double x;
//x=0.5556;
//x=0.5556001;
x=0.5555;
//x=0.5555001;
printf("%.lf\n",x);
printf("%.2lf\n",x);
printf("%.3lf\n",x);
printf("%.4lf\n",x);
printf("%.5lf\n",x);
printf("%.6lf\n",x);
printf("%.7lf\n",x);
printf("%.8lf\n",x);
printf("%.9lf\n",x);
printf("%.10lf\n",x);
return 0;
}
当x=0.5555时,请看保留三位小数时输入结果:
当x=0.5555001时,请看结果:
猜想:发现要求精确度为 小数点后 总位数-1 时,最后一位不四舍五入,直接舍去。(事实这个结论是不对的,只是猜想)
下面在证实:
当x=0.5556时,请看:
当x=0.5556001时,再看:
直接上结论把。因为double 精度为小数点15,16位。前面只是现象,后面亲测得出结论:
当小数点后面分别是4,5,7,9,13个5(全是5),且要精确小数点后3,4,6,12位时,直接舍去5,不进行四舍五入。其余情况四舍五入。
至于为什么。本人猜想只是跟double 的存储有关,但本人计算机组成原理学的不咋地。无法用 IEE754标准 去解释这一现象。大家直接记住结论就可以了。避免以后关于double 问题 在这方面的错误。果断AC。。。
另外附上HDU1985AC代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t,k;
double x;
char s[10];
scanf("%d",&t);
k=1;
while(t--)
{
scanf("%lf%s",&x,s);
printf("%d ",k++);
if(strcmp(s,"kg")==0)
printf("%.4lf lb",2.2046*x);
if(strcmp(s,"lb")==0)
printf("%.4lf kg",x*0.4536);
if(strcmp(s,"g")==0)
printf("%.4lf l",x*3.7854);
if(strcmp(s,"l")==0)
printf("%.4lf g",x*0.2642);
printf("\n");
}
return 0;
}
欢迎大牛,弱菜拍砖!!!