我该如何在C语言中将浮点数(例如37.777779)四舍五入至小数点后两位(37.78)?
我该如何在C语言中将浮点数(例如37.777779)四舍五入至小数点后两位(37.78)?
float roundf(float x)
。#include <math.h>
// When |x| is less than FLT_MAX/100
float y = roundf(x * 100.0f) / 100.0f;
void r100(const char *s) {
float x, y;
sscanf(s, "%f", &x);
y = round(x*100.0)/100.0;
printf("%6s %.12e %.12e\n", s, x, y);
}
int main(void) {
r100("1.115");
r100("1.125");
r100("1.135");
return 0;
}
1.115 1.115000009537e+00 1.120000004768e+00
1.125 1.125000000000e+00 1.129999995232e+00
1.135 1.134999990463e+00 1.139999985695e+00
y = roundf(x*100.0f)/100.0f;
#define roundz(x,d) ((floor(((x)*pow(10,d))+.5))/pow(10,d))
a = 8.000000
sqrt(a) = r = 2.828427
roundz(r,2) = 2.830000
roundz(r,3) = 2.828000
roundz(r,5) = 2.828430
#define ROUNDF(f, c) (((float)((int)((f) * (c))) / (c)))
这里有一个例子:
float x = ROUNDF(3.141592, 100)
x等于3.14 :)
double f_round(double dval, int n)
{
char l_fmtp[32], l_buf[64];
char *p_str;
sprintf (l_fmtp, "%%.%df", n);
if (dval>=0)
sprintf (l_buf, l_fmtp, dval);
else
sprintf (l_buf, l_fmtp, dval);
return ((double)strtod(l_buf, &p_str));
}
n
表示小数点后的位数。double d = 100.23456;
printf("%f", f_round(d, 4));// result: 100.2346
printf("%f", f_round(d, 2));// result: 100.23
dval
很大,它将会溢出并可能导致崩溃,3)奇怪的 if
/ else
块,在每个分支中都做了完全相同的事情,4)过于复杂的使用 sprintf
来构建第二个 sprintf
调用的格式说明符;更简单的方法是只使用 .*
并将双精度值和小数位数作为参数传递给同一个 sprintf
调用。 - Mark Amery或者您可以老派地不使用任何库来完成:
float a = 37.777779;
int b = a; // b = 37
float c = a - b; // c = 0.777779
c *= 100; // c = 77.777863
int d = c; // d = 77;
a = b + d / (float)100; // a = 37.770000;
a
远超出int
范围时会失败。当c *= 100
在某些情况下产生舍入时也会失败。 - chux - Reinstate Monicadouble Round(double x, int p)
{
if (x != 0.0) {
return ((floor((fabs(x)*pow(double(10.0),p))+0.5))/pow(double(10.0),p))*(x/fabs(x));
} else {
return 0.0;
}
}
double val;
// ...perform calculations on val
String(Round(Round(Round(val,8),6),2));
对于val = 6.825
,结果如预期的一样为6.83
。
对于val = 6.824999
,结果为6.82
。这里的假设是计算结果确切为6.824999
,并且第7个小数位为零。
对于val = 6.8249999
,结果为6.83
。在这种情况下,第7个小数位为9
导致Round(val,6)
函数给出了预期的结果。对于此案例,可能会有任意数量的后续9
。
对于val = 6.824999499999
,结果为6.83
。首先进行到第8个小数位的四舍五入,即Round(val,8)
,以解决一个令人讨厌的情况——即计算得到的浮点结果计算为6.8249995
,但在内部表示为6.824999499999...
。
最终,问题中的示例... val = 37.777779
的结果是 37.78
。
这种方法可以进一步概括为:
double val;
// ...perform calculations on val
String(Round(Round(Round(val,N+2),N),2));
N是浮点数/双精度浮点数进行所有中间计算时需要保留的精度。这也适用于负值。我不知道这种方法在所有情况下是否在数学上是正确的。
此函数接受数字和精度参数,并返回四舍五入后的数字。
float roundoff(float num,int precision)
{
int temp=(int )(num*pow(10,precision));
int num1=num*pow(10,precision+1);
temp*=10;
temp+=5;
if(num1>=temp)
num1+=10;
num1/=10;
num1*=10;
num=num1/pow(10,precision+1);
return num;
}
float
(和double
)不是十进制浮点数,而是二进制浮点数,因此无法正确对数字本身四舍五入到小数位, 因此将它们四舍五入到小数位置没有意义。 但可以对输出进行四舍五入。 - Pavel Minaev