如何在C中四舍五入浮点值(如37.777779)到小数点后两位(37.78)?


当前回答

另外,如果你使用c++,你可以创建一个这样的函数:

string prd(const double x, const int decDigits) {
    stringstream ss;
    ss << fixed;
    ss.precision(decDigits); // set # places after decimal
    ss << x;
    return ss.str();
}

然后你可以输出小数点后n位的任何double myDouble,代码如下:

std::cout << prd(myDouble,n);

其他回答

...或者你也可以采用传统的方式,不需要任何库:

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;

当然,如果你想从数字中去除额外的信息。

假设你谈论的是打印的值,那么Andrew Coleson和AraK的答案是正确的:

printf("%.2f", 37.777779);

但请注意,如果你的目标是将数字四舍五入到37.78以供内部使用(例如与另一个值进行比较),那么这不是一个好主意,因为浮点数的工作方式:你通常不想对浮点数进行相等比较,而是使用一个目标值+/-一个sigma值。或者将数字编码为具有已知精度的字符串,并进行比较。

请参阅Greg Hewgill对相关问题的回答中的链接,其中还涵盖了为什么不应该使用浮点数进行财务计算。

这个宏用于浮点数四舍五入。 把它添加到你的头文件中

#define ROUNDF(f, c) (((float)((int)((f) * (c))) / (c)))

这里有一个例子:

float x = ROUNDF(3.141592, 100)

X = 3.14:)

在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个变量,但我把它们留在那里,这样你就可以看到逻辑。可能有更简单的解决方案,但这对我来说很有效——特别是因为它允许我根据需要调整小数点后的位数。

如果只是为了输出而四舍五入,则“%.”2f”格式的字符串确实是正确的答案。然而,如果你真的想要四舍五入浮点值以进行进一步的计算,像下面这样的方法是可行的:

#include <math.h>

float val = 37.777779;

float rounded_down = floorf(val * 100) / 100;   /* Result: 37.77 */
float nearest = roundf(val * 100) / 100;  /* Result: 37.78 */
float rounded_up = ceilf(val * 100) / 100;      /* Result: 37.78 */

请注意,您可能想要选择三种不同的舍入规则:向下舍入(即,在小数点后两位截断)、四舍五入到最接近的位置和向上舍入。通常,你要绕到最近的地方。

正如其他几个人指出的那样,由于浮点表示法的特殊性,这些四舍五入的值可能并不完全是“明显的”十进制值,但它们非常非常接近。

有关舍入的更多信息,特别是舍入到最近的平局规则,请参阅维基百科关于舍入的文章。