4

可能重复:
将数字四舍五入到 C 中的 2 个小数位

我还没有在 c 中找到带有double round(double d, int digits)这里这样的签名的函数。当我尝试构建时出现错误:

错误:函数“round”的参数太多

如何在 C 中舍入小数点后 N 位?

4

4 回答 4

4

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

#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];
}
于 2012-12-22T14:15:03.817 回答
1

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

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

当然,如前所述,浮点数没有固定的十进制位数,例如,如果您调用,则不能保证将其打印为 3.70000 printf("%8.5f", round1(3.7519, 1));

于 2012-12-22T14:15:35.060 回答
0

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

double round1(double num, int N) {
      int temp=(int) num*pow(10,N); 
      double roundedN= temp/pow(10,N);
      return roundedN;
}
于 2012-12-22T14:10:08.197 回答
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;
}

另请参阅上面关于浮点“小数点”的评论。

于 2012-12-22T14:14:28.443 回答