如何在C中四舍五入浮点值(如37.777779)到小数点后两位(37.78)?
当前回答
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
其他回答
如果只是为了输出而四舍五入,则“%.”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 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。
在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个变量,但我把它们留在那里,这样你就可以看到逻辑。可能有更简单的解决方案,但这对我来说很有效——特别是因为它允许我根据需要调整小数点后的位数。
假设你谈论的是打印的值,那么Andrew Coleson和AraK的答案是正确的:
printf("%.2f", 37.777779);
但请注意,如果你的目标是将数字四舍五入到37.78以供内部使用(例如与另一个值进行比较),那么这不是一个好主意,因为浮点数的工作方式:你通常不想对浮点数进行相等比较,而是使用一个目标值+/-一个sigma值。或者将数字编码为具有已知精度的字符串,并进行比较。
请参阅Greg Hewgill对相关问题的回答中的链接,其中还涵盖了为什么不应该使用浮点数进行财务计算。
没有办法将一个浮点数四舍五入为另一个浮点数,因为四舍五入的浮点数可能不可表示(浮点数的限制)。例如,假设你将37.777779四舍五入为37.78,但最接近的数字是37.781。
然而,你可以使用格式化字符串函数来“舍入”浮点数。
推荐文章
- c++中size_t和int的区别是什么?
- 在C和c++中静态变量存储在哪里?
- errno线程安全吗?
- 如何在C程序中获取当前目录?
- 互斥实例/教程?
- 如何添加一个'或'条件在#ifdef
- extern关键字对C函数的影响
- 如果使用if-return-return或if-else-return?
- 用于双值的assertEquals的delta或epsilon参数的含义
- 转换Python程序到C/ c++代码?
- 为什么程序不是经常用汇编编写的?
- 有没有替换Windows (Visual C)的unistd.h ?
- 使用gcc命令行从.c文件构建.so文件
- C多行宏:do/while(0) vs作用域块
- time_t最终的类型定义是什么?