【C言語】1の位を四捨五入する方法

プログラミングで四捨五入することはよくあることでしょう。

そのため、C言語にも四捨五入するためのround関数が用意されています。

ですが、round関数は小数点以下の数値を四捨五入する関数であるため、整数部分の四捨五入はできません。

そのため下記コードは、round関数を使っても元の数値と何も変わりません。

#include<math.h>

int main() {

	//124のまま
	int result = round(124);

	return 0;
}

今回は1の位の四捨五入など、整数部分の四捨五入をするプログラムの書き方を解説します。

目次から探す

1の位を四捨五入する簡単な方法

最もシンプルで実用性のある方法を紹介します。

#include<math.h>

int main() {

	int num = 126;
	double calcnum = num / 10.0;
	calcnum = round(calcnum);
	num = calcnum * 10;

	return 0;
}

順番にコードをトレースしていきましょう。

まずは四捨五入する数値を5行目のint num = 126;で定義しています

次の6行目が非常に重要ポイント。

小数を扱えるdouble型に四捨五入する整数を10で割ります。10の位の四捨五入なら100、100の位の四捨五入なら1000で割ってください。

今回であれば、num / 10.012.6となるので、calcnumには12.6が代入された状態になります。

注意ポイント

必ず割る数字は10.0のようにdouble型として認識される表記にしてください。

そうしないと計算結果の小数部分が切り捨てられて正常に四捨五入できません。

次に8行目でround(calcnum)で四捨五入し、calcnumを上書きしています。12.6を四捨五入すると13.0になるので、この時点ではcalcnum13.0が代入されています。

最後に9行目。現在は数値が10分の1になっているため、10をかけて元の桁数に戻しています。

このとき、10で割ったときに発生した小数点以下の数値がなくなっているため、単純に10倍すると必ず下一桁が0になります。

つまり、13に10をかけて130。126という数値の一の位がしっかり四捨五入できていることが確認できます。

試しに123/248/315などいろんな数字で試してみてください。しっかり四捨五入されます。

同様の手順で100で割った数字をround関数で四捨五入して100倍すると10の位を四捨五入というようになるので、とても実用性のある計算方法です。

行数も少なくif文を使った条件分岐もないので見やすい上に、関数化することも簡単でしょう。

【応用編】あらゆる桁数に対応できる四捨五入関数

詳しくは解説しませんが、以下ような関数を実装すればあらゆる桁数の四捨五入に対応することが可能です。

#include<math.h>

/*
num : 四捨五入する数値
keta : 四捨五入する桁数
*/
int roundFunc(int num, int keta) {
	double bai = 1.0;
	for (int i = 0; i < keta; i++) {
		bai *= 10;
	}
	double calcnum = num / bai;
	calcnum = round(calcnum);
	num = calcnum * bai;

	return num;

}

int main() {

	int num = 12345;
	roundFunc(num, 1); //12350
	roundFunc(num, 2); //12300
	roundFunc(num, 3); //12000
	roundFunc(num, 4); //10000

	return num;
}

このような関数を作れば、四捨五入する数値と桁数を指定するだけで四捨五入できるようになります。

桁数が1つ変わると、計算に使う倍率も10・100・1000と10倍ずつ変わっていくので、for文で桁数分のループを回して10倍していけば四捨五入に使うための倍率を簡単に求められます。

無駄な行数も少なくなってプログラムが見やすくなるので、こういった簡単な処理でも関数化できるものを関数化できるように頑張りましょう。

目次から探す