プログラミングで四捨五入することはよくあることでしょう。
そのため、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.0
は12.6
となるので、calcnum
には12.6
が代入された状態になります。
必ず割る数字は10.0のようにdouble型として認識される表記にしてください。
そうしないと計算結果の小数部分が切り捨てられて正常に四捨五入できません。
次に8行目でround(calcnum)
で四捨五入し、calcnum
を上書きしています。12.6を四捨五入すると13.0になるので、この時点ではcalcnum
に13.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倍していけば四捨五入に使うための倍率を簡単に求められます。
無駄な行数も少なくなってプログラムが見やすくなるので、こういった簡単な処理でも関数化できるものを関数化できるように頑張りましょう。