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に対しては繰り上げが起こらないので、汎用的に用いることができます。
ここまでは、小数点以下第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: 作成