user-0 提问: 求四舍五入函数

回复:
user: user-1
content: #include <stdio.h>  #include <math.h>  double Round(double x, int d) {      double dRetval;      double dMod = 0.0000001;      if (x<0.0) dMod=-0.0000001;      dRetval=x;      dRetval+=(5.0/pow(10.0,d+1.0));      dRetval*=pow(10.0,d);      dRetval=floor(dRetval+dMod);      dRetval/=pow(10.0,d);      return dRetval;  }  int main(void)  {      int n;      double x;      scanf("%lf%d",&x,&n);      printf("%g\n",Round(x,n));        return 0;  }

user: user-0
content: 引用 18 楼 finalfantasy_xu 的回复:网上不是到处都是？我搜过了，没有，不一样的，这个比较难

user: user-2
content: 网上不是到处都是？

user: user-3
content: #include <stdio.h> #include <math.h> double Round(double x, int d) {     double dRetval;     double dMod = 0.0000001;     if (x<0.0) dMod=-0.0000001;     dRetval=x;     dRetval+=(5.0/pow(10.0,d+1.0));     dRetval*=pow(10.0,d);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,d);     return dRetval; } int main(void) {     int n;     double x;     scanf("%lf%d",&x,&n);     printf("%g\n",Round(x,n));      return 0; } //输入123.456 2 //输出123.46

user: user-3
content: 引用 14 楼 是疗伤烧肉粽~ 的回复:[quote=引用 12 楼 赵4老师 的回复:]//Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } 编译错误[/quote] 自己将sprintf改为sprintf_s,scanf改为scanf_s

user: user-0
content: 引用 11 楼 NorZ 的回复:[quote=引用 6 楼 是疗伤烧肉粽~ 的回复:][quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }这个不太行，在PTA有两个测试点没过，就过了一个[/quote]  因为他最后返回的时候强转了 int ...你给改成 double 应该就行[/quote]改了之后一个测试点都过不了

user: user-0
content: 引用 12 楼 赵4老师 的回复://Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } 编译错误

user: user-0
content: 引用 9 楼 NorZ 的回复:[quote=引用 8 楼 NorZ 的回复:][quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }  像这种输入的 double 数值，直接和 0 比较来判断正负就行，你这样写的话，都引入 math 库了，也就可以直接用 math 库的 round 函数来四舍五入 x*m ，那也没有判断正负的必要了[/quote]   # include <math.h> double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     return (double)(round(x*m)/(1.0*m)); } [/quote]谢了，但还有一个测试点运行超时

user: user-4
content: 你的需求可能需要写asm 代码，幂计算需要协处理器可能比较慢。难点在于二进制小数位的判断，需要使用数表（事先计算好二进制对应的进位项位数，阈值，进位后的值）。否则就需要使用bcd码像处理字符那样逐位操作。

user: user-3
content: //Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); }

user: user-5
content: 引用 6 楼 是疗伤烧肉粽~ 的回复:[quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }这个不太行，在PTA有两个测试点没过，就过了一个[/quote]  因为他最后返回的时候强转了 int ...你给改成 double 应该就行

user: user-6
content: 就你题目上的例子: 123.4562 123.46  让123.4562 * 100    也就是  12345.62  这时候也就可以用哪个方法，四舍五入就是12346 然后12346   / 100    也就是 123.46了  也就是 123.4562 * 10^n  四舍五入 然后 / 10^n（n为保留的位数）

user: user-5
content: 引用 8 楼 NorZ 的回复:[quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }  像这种输入的 double 数值，直接和 0 比较来判断正负就行，你这样写的话，都引入 math 库了，也就可以直接用 math 库的 round 函数来四舍五入 x*m ，那也没有判断正负的必要了[/quote]   # include <math.h> double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     return (double)(round(x*m)/(1.0*m)); }

user: user-5
content: 引用 5 楼 qzjhjxj 的回复:供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }  像这种输入的 double 数值，直接和 0 比较来判断正负就行，你这样写的话，都引入 math 库了，也就可以直接用 math 库的 round 函数来四舍五入 x*m ，那也没有判断正负的必要了

user: user-0
content: 引用 2 楼 突触 的回复:浮点型转整型时，是去掉小数部分(也可以称为向零求正) 如:    (int)1.6 -> 1 (int)1.3 -> 1 当浮点型为正数时加上0.5    (int)(1.6+0.5)  = (int)2.1 -> 2 (int)(1.3+0.5)  = (int)1.8 -> 1 不做理论证明直接说结论   当浮点型为正数时，浮点型+0.5 在转为整型就相当于四舍五入  当浮点型为负数的时候就需要    -0.5  具体代码  #include <STDIO.H>  int Fun_To(float n) { 	float a=0.5f; 	int sign= *(int*)&n & 0x80000000;  //取正号或负号 									   // 0x3F000000  是浮点型的0.5 这里直接用16进制表示了 	int h= 0x3F000000 | sign;		   // 根据符号转为  -0.5或 +0.5 	return n + *(float*)&h;            // 浮点型加 +/- 0.5 }  int main(int argc, char* argv[]) { 	 	printf("%d\n",Fun_To(-3.6));  	return 0; }  你这个只能一个小数点才能，多个小数就不行了

user: user-0
content: 引用 5 楼 qzjhjxj 的回复:供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }这个不太行，在PTA有两个测试点没过，就过了一个

user: user-7
content: 供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }

user: user-6
content: 等级  勋章Blank	 抱歉 没有仔细看题目   如果你愿意的话 ， 还是可以用上面的方法 用浮点型 乘以 10^n， 四舍五入后 在除以10^n

user: user-6
content: 浮点型转整型时，是去掉小数部分(也可以称为向零求正) 如:    (int)1.6 -> 1 (int)1.3 -> 1 当浮点型为正数时加上0.5    (int)(1.6+0.5)  = (int)2.1 -> 2 (int)(1.3+0.5)  = (int)1.8 -> 1 不做理论证明直接说结论   当浮点型为正数时，浮点型+0.5 在转为整型就相当于四舍五入  当浮点型为负数的时候就需要    -0.5  具体代码  #include <STDIO.H>  int Fun_To(float n) { 	float a=0.5f; 	int sign= *(int*)&n & 0x80000000;  //取正号或负号 									   // 0x3F000000  是浮点型的0.5 这里直接用16进制表示了 	int h= 0x3F000000 | sign;		   // 根据符号转为  -0.5或 +0.5 	return n + *(float*)&h;            // 浮点型加 +/- 0.5 }  int main(int argc, char* argv[]) { 	 	printf("%d\n",Fun_To(-3.6));  	return 0; }

user: user-8
content: 这个对吗 我咋运行不了 下面给我来个这 id returned 1 exit status 请问这该怎么办