如何在C中四舍五入浮点值(如37.777779)到小数点后两位(37.78)?
当前回答
使用float roundf(float x)。
舍入函数将其参数舍入为浮点格式中最接近的整数值,无论当前舍入方向如何,舍入距离为零的中间情况。C11dr§7.12.9.5
#include <math.h>
float y = roundf(x * 100.0f) / 100.0f;
根据你的浮点数实现,看起来是一半的数字并不是。因为浮点数通常是面向2进制的。此外,在所有“中途”情况下,精确舍入到最接近0.01是最具挑战性的。
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
虽然“1.115”是介于1.11和1.12之间的“中间值”,但当转换为float时,其值为1.115000009537…并且不再是“半程”,而是更接近1.12,并四舍五入到最接近的浮动1.120000004768…
“1.125”是介于1.12和1.13之间的“中间值”,当转换为float时,值正好是1.125,是“中间值”。由于与偶数规则的关系,它四舍五入到1.13,并四舍五入到最接近的浮点数1.129999995232…
虽然“1.135”是介于1.13和1.14之间的“中间值”,但当转换为float时,其值为1.134999990463…并且不再是“半途”,而是更接近1.13,并舍入到最接近的浮动1.129999995232…
如果使用代码
y = roundf(x*100.0f)/100.0f;
虽然“1.135”是介于1.13和1.14之间的“中间值”,但当转换为float时,其值为1.134999990463…并且不再是“半路”,而是更接近1.13,但错误地舍入到浮动1.139999985695…由于浮点数和双精度数的精度更有限。这个不正确的值可能被视为正确的,这取决于编码目标。
其他回答
在c++中(或在带有C风格强制类型转换的C中),您可以创建以下函数:
/* Function to control # of decimal places to be output for x */
double showDecimals(const double& x, const int& numDecimals) {
int y=x;
double z=x-y;
double m=pow(10,numDecimals);
double q=z*m;
double r=round(q);
return static_cast<double>(y)+(1.0/m)*r;
}
然后std::cout << showDecimals(37.777779,2);结果是:37.78。
显然,你不需要在函数中创建所有5个变量,但我把它们留在那里,这样你就可以看到逻辑。可能有更简单的解决方案,但这对我来说很有效——特别是因为它允许我根据需要调整小数点后的位数。
此函数接受数字和精度,并返回四舍五入后的数字
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;
}
它通过左移浮点数并检查大于5的条件将浮点数转换为int。
...或者你也可以采用传统的方式,不需要任何库:
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;
当然,如果你想从数字中去除额外的信息。
使用%。printf中的2f。它只打印2个小数点。
例子:
printf("%.2f", 37.777779);
输出:
37.77
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