如何在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);
其他回答
如果只是为了输出而四舍五入,则“%.”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 value = 37.777779;
float rounded = ((int)(value * 100 + .5) / 100.0);
另外,如果你使用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 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 ceilf(float x); // don't forget #include <math.h> and link with -lm.
例子:
float valueToRound = 37.777779;
float roundedValue = ceilf(valueToRound * 100) / 100;