首先要明白浮点数在计算机中都绝大多数是近似值。其实C++对浮点数是自动四舍五入的,而且是非常严格地下一位为5则入,小于5则不入。这在double型时一般是没有问题的。在float型时,因精度低,内存中的近似值可能刚好使决定四舍五入的那一位的5不足额,造成不能四舍五入。例如float x=3.1415;,实际上内存中的二进制换算过来是3.14149999999999...;,这样取3位小数后就成了3.141而不是3.142了;如果换成double型,立马就变成3.142了。可以这样解决就保险了:float型的有效位是6位左右,给要输出的变量加一个1E-6,四舍五入的问题就解决了。如:
int main(void){
double x=3.1415;
cout << setprecision(4) << x << endl;
return 0;
}
输出是3.142。
int main(void){
float x=3.1415;
cout << setprecision(4) << x << endl;
return 0;
}
这个输出是3.141。
而
int main(void){
double x=3.1415;
cout << setprecision(4) << (x+1E-6) << endl;
return 0;
}
的输出就是3.142了
double dround(double x,int bit)//double round
{
double y=1;
for(int i=0;iy *=10;
return (int)(x*y+0.5)/y;
}
double fun(double num, int n)
{
for(int i = 0; i < n; ++ i ){num *= 10;}
num = (num + 0.5) %1;
for(int i = 0; i < n; ++ i ){num /= 10;}
return num;
}
/*编写一个函数double myround(double x),输入一个小数,将它四舍五入。
*例如:myround(-3.51)的值是-4.0,myround(4.49)的值是4.0。可以调用math.h中的
*库函数ceil和floor实现这个函数。*/
#include
#include
double myround(double x);
int main()
{
double num=1.00;
printf("please enter the value of num(double):");
scanf("%lf",&num);
//printf("%lf\n",num);
//printf("%lf\n",floor(num));
printf("你输入的值进行四舍五入后的结果为:%lf\n",myround(num));
return 0;
}
double myround(double x)
{
//double add=0.5;
//int min,max;
int sa,si;//sa用于保存x的整数部分,si用于保存加0.5后的临时值
if(x==0.0)
return 0.0;
else
if(x>0.0)
{sa=(int)x;
si=x+0.5;
if(sa==floor(si))//如果if语句成立说明x的小数比0.5小,应当舍去
return sa;
else
return sa+1;
}
else
{sa=(int)x;
si=x-0.5;
if(sa==ceil(si))
return sa;
else
return sa-1;
}
}