4

重複の可能性:
数値をCの小数点以下2桁に丸める

ここcのdouble round(double d, int digits)ようなシグネチャを持つ関数は見つかりませんでした。ビルドしようとすると、エラーが発生します。

エラー:関数'round'には引数が多すぎます

小数点以下N桁のCで四捨五入するにはどうすればよいですか?

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やや高速である可能性が高いメソッドですが、slow関数への1回の呼び出しに依存しています。

#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;
}

printf("%8.5f", round1(3.7519, 1));もちろん、前述のように、浮動小数点数には小数点以下の桁数が設定されていません。たとえば、呼び出した場合、これが3.70000として出力されるとは限りません。

于 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 に答える