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


当前回答

这个怎么样:

float value = 37.777779;
float rounded = ((int)(value * 100 + .5) / 100.0);

其他回答

假设你谈论的是打印的值,那么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:)

没有办法将一个浮点数四舍五入为另一个浮点数,因为四舍五入的浮点数可能不可表示(浮点数的限制)。例如,假设你将37.777779四舍五入为37.78,但最接近的数字是37.781。

然而,你可以使用格式化字符串函数来“舍入”浮点数。

如果只是为了输出而四舍五入,则“%.”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 */

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

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

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

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

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;

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