在C中舍入,小数点后有N位数

时间:2012-12-22 14:03:10

标签: c math rounding

  

可能重复:
  Rounding Number to 2 Decimal Places in C

我在c中找不到像here这样的签名double round(double d, int digits)的函数。 当我尝试构建时,我得到一个错误:

  

错误:函数'round'的参数太多

如何在小数点后用N位数对C进行舍入?

4 个答案:

答案 0 :(得分:3)

使用递归(对某些数字值来说会很慢)

#include <math.h>
double my_round(double x, unsigned int digits) {
  if (digits > 0) {
    return my_round(x*10.0, digits-1)/10.0;
  }
  else {
    return round(x);
  }
}

一种方法可能稍快一些,但它依赖于对pow函数的单次调用:

#include <math.h>

double my_round(double x, unsigned int digits) {
    double fac = pow(10, digits);
    return round(x*fac)/fac;
}

更快的方法是使用可能的权力预先计算查找表,并使用而不是pow

#include <math.h>

double fac[];  // population of this is left as an exercise for the reader

double my_round(double x, unsigned int digits) {
    return round(x*fac[digits])/fac[digits];
}

答案 1 :(得分:0)

这是一个(非常)简单的功能,

double round1(double num, int N) {
      int temp=(int) num*pow(10,N); 
      double roundedN= temp/pow(10,N);
      return roundedN;
}

答案 2 :(得分:0)

在C标准中,此功能不存在。无论如何,你可以自己写。

#include <math.h>

/* Round `n` with `c` digits after decimal point. */

double nround (double n, unsigned int c)
{
    double marge = pow (10, c);
    double up    = n * marge;
    double ret   = round (up) / marge;

    return ret;
}

另见上面关于浮点“小数点”的评论。

答案 3 :(得分:0)

虽然“回答”给出了一个不错的答案,但这里有一个适用于任意大数字的答案:

double round1(double num, int N) {
      ASSERT(N > 0);
      double p10 = pow(10,N);
      return round(num* p10) / p10;
}

当然,如上所述,浮点数没有设定的十进制数字,如果你打电话给printf("%8.5f", round1(3.7519, 1));,则不保证PRINT为3.70000。