今天做poj3299(很简单的一道题)遇到了浮点数取整的问题,根据网上的资料整理了一下。
假设输入的数据为
double a = 3.146;
要求保留两位小数。最通常的做法是:
double b = (int)((a *100) + 0.5) /100.0;
这样便能够得到3.15;
但是这样有个问题,当对负数进行四舍五入时,如-3.146,精确到3位进行四舍五入,应该是-3.15,但是使用上述方法得到的是-3.14.因此需要对输入的浮点数进行正负的判断。
double _round(double in)
{
if(in > 0.00)
return ((int)(in * 100) + 0.5)/ 100.0);
else
return ((int)(in * 100) - 0.5)/ 100.0);
}
但还有个问题,浮点数与0比较时不能这样写,所以应将与0比较的代码改为:
if(in > 0.00001)
所以,若要在加上精度的话,比较完整的代码是
double _round(double in,int precision)
{
long pre =1,i;
for(i = 0;i < precision;i++)
pre = pre * 10;
if( in > 1.0 / (pre * 10))
return ((int)(in * pre + 0.5) / (double)pre);
else
return ((int)(in * pre - 0.5) / (double)pre);
}
还有一种方法是用atof函数。
double _round(double in,int precision)
{
char buf[50],cmd[10];
sprintf(cmd,"%%.%df",precision);
sprintf(buf,cmd,in);
return atof(buf);
}
但是,所以貌似上述的方法都有精度的问题。
这儿有两篇帖子,可以看一下:
除了四舍五入的问题,从这个题中得到的一点经验有 scanf读取double类型的问题,应该这样读取
scanf("%lf",&d);
还有一点就是要想得到浮点数,作除法时需要注意变量(*1.0?)。