重複の可能性:
数値をCの小数点以下2桁に丸める
ここcのdouble round(double d, int digits)
ようなシグネチャを持つ関数は見つかりませんでした。ビルドしようとすると、エラーが発生します。
エラー:関数'round'には引数が多すぎます
小数点以下N桁のCで四捨五入するにはどうすればよいですか?
重複の可能性:
数値をCの小数点以下2桁に丸める
ここcのdouble round(double d, int digits)
ようなシグネチャを持つ関数は見つかりませんでした。ビルドしようとすると、エラーが発生します。
エラー:関数'round'には引数が多すぎます
小数点以下N桁のCで四捨五入するにはどうすればよいですか?
再帰の使用(数字の一部の値では遅くなります)
#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];
}
「答えられた」はまともな答えを与えますが、これは任意に大きな数に対して機能するものです:
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として出力されるとは限りません。
これが(非常に)単純な関数です。
double round1(double num, int N) {
int temp=(int) num*pow(10,N);
double roundedN= temp/pow(10,N);
return roundedN;
}
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;
}
浮動小数点の「小数点」に関する上記のコメントも参照してください。