C言語による丸め(四捨五入など)

概要

C言語には、どういうわけか切り捨て/切り上げ/四捨五入といった、「値を丸める」考えがないものですから、プログラミングが必要です。

アルゴリズム

切り捨て

実数 src は、整数型にキャスト(型変換)することによって、小数点以下第1位での切り捨てを簡単に実現できます。

dst = (int)src;    /*変数dstが整数型の場合*/

切り捨ての結果を、実数型変数に代入するときには、さらに代入する変数の型に変換する必要があります。

dst = (double)(int)src;    /*変数dstが倍精度実数型の場合*/

切り上げ

切り捨てと同様に、小数点以下第1位で考えるとき、0.1~0.9に対して繰り上げを行う必要があります。このとき「0.1のときには0.9を加え、0.2のときは0.8…」では非効率です。
そこで、0.9を加えてから小数点以下第1位を切り捨てることを考えます。

dst = (int)(src + 0.9);    /*変数dstが整数型の場合*/

0.1~0.9に対しては繰り上げが起こり、0.0に対しては繰り上げが起こらないので、汎用的に用いることができます。

四捨五入

小数点以下第1位が 0.5 未満であれば切り捨て、0.5以上であれば切り上げと考えることができます。実数 src から小数点以下の値だけを取り出す場合、以下の演算が有効です。

src - (double)(int)src;    /*変数srcが倍精度実数型の場合*/

この場合、以下の記述で四捨五入を実現できます。

if(src - (double)(int)src < 0.5)    dst = (double)(int)src;           /*0.5未満なら切り捨て*/
else                                dst = (double)(int)(src + 0.9);   /*0.5以上なら切り上げ*/

ただし、上の考え方は、あくまでも「実数 src から小数点以下の値だけを取り出す」ことに重きを置いており、実際は src + 0.5 をキャストすることで簡単に実現できます。

dst = (int)(src + 0.5);    /*変数dstが整数型の場合*/

0.5~0.9に対しては繰り上げが起こり、0.0~0.4に対しては繰り上げが起こらないので、汎用的に用いることができます。

小数点以下第 n 位に対する処理

ここまでは、小数点以下第1位に対しての処理に対する考え方でした。小数点以下第 n 位に対して処理を行うときは、第 n 位を第 1 位に慣らして処理を行うことになります。10n の位を 10-1 の位にするためには、src に 10-n-1 を掛ける必要があり、丸め処理を行った後で 10-(-n-1) を掛けて位を戻します。

src = src * pow(10, -n - 1);          /*処理を行う桁を10-1 の位にする*/
dst = (double)(int)(src + 0.5);      /*四捨五入の場合*/
dst = dst * pow(10, n + 1);       /*処理を行った桁を元に戻す*/

サンプルソース

丸め処理を行う数値 src は、小数点以下第1位で処理を行うため、関数を実行する際に実数型にキャストする必要があります。

/*四捨五入(10のn乗の位を処理)*/
#include <math.h>

double    round(double src, int n)
{
    double dst;
    
    dst = src * pow(10, -n - 1);          /*処理を行う桁を10-1 の位にする*/
    dst = (double)(int)(dst + 0.5);
    
    return    dst * pow(10, n + 1);       /*処理を行った桁を元に戻す*/
}

更新履歴

2008/07/21: 作成


Back / Studying / Top