#include
int p10(int m);//求10的次方
double rounding(double n,int w);//小数四舍五入,参数w:精确到第几数
int main()
{
int w;
double n;
while(1)
{
printf("请输入一个实数:");
scanf("%lf",&n);
printf("请输入要精确到小数点后几位:");
scanf("%d",&w);
n=rounding(n,w);
printf("四舍五入后的数值为:%.*lf\n\n",w,n);
}
return 0;
}
double rounding(double n,int w)//小数四舍五入,参数w:精确到第几数
{
int z,p=p10(w+1);
double d;
d=n-(int)n;
d+=1.0/p10(11);//避免精度丢失
d*=p;
d=(int)d;
z=(int)d%10;
if(z>=5)
d=((d+10)-z)/p+(int)n;
else
d=(d-z)/p+(int)n;
return d;
}
int p10(int m)//求10的次方
{
int i,sum=1;
for(i=0;isum*=10;
return sum;
}
利用取整截断小数部分的特性来实现:
float x=3.1415,y; int a;
y=x*100+0.5; a=y; y=a; y/=100; //至此,y中存储的数为x的保留2位小数的结果
正数 x 四舍五入的技巧:
x --> (int)(x+0.5)
当 x=n+r, 0<=r<1,
若 0<=r<0.5, 则r+0.5<1, (int)(x+0.5)=(int)(n+r+0.5)=n
若 0.5<=r<1, 则1<= r+0.5, (int)(x+0.5)=(int)(n+r+0.5)=n+1