C言語では、どうやって実数(小数点以下を含む数)の切り捨て・四捨五入・切り上げのプログラミングをするんだろう?という方のための記事です。
消費税計算を例にとり説明します。
方法は、おもに2種類あります。
- 計算式により切り捨て・四捨五入・切り上げをする
- math.hで定義された数学関数(floor, round, ceil)を使う
計算式により切り捨て・四捨五入・切り上げをする方法
まずはシンプルに計算により切り捨て・四捨五入・切り上げをする方法です。
※プログラムはすべて消費税率を10%とした場合の計算となります。(これ以上消費税率が上がらないことを祈ります!)
サンプルコード
zeikomi.c
/*
税込価格で切り捨て・四捨五入・切り上げを行う
※C言語のmath.h関数を利用しないで行う
*/
#include <stdio.h>
int main(void){
double price;
int down, rounding, up; /* 切り捨て、四捨五入、切り上げ */
/* 金額を入力 */
printf("おいくら? ");
scanf("%lf", &price);
/* 実際の値 */
printf("\n実際の値:\n");
printf("%f * 1.1 = %f\n\n", price, price * 1.1);
/* 切り捨て */
down = (int)(price * 1.1);
printf("切り捨て: %d円\n", down);
/* 四捨五入 */
rounding = (int)(price * 1.1 + 0.5);
printf("四捨五入: %d円\n", rounding);
/* 切り上げ */
up = (int)(price * 1.1 + 0.999999);
printf("切り上げ: %d円\n", up);
return 0;
}
実行イメージ(キーボードから92と入力した場合のイメージです。適当な金額を入力してください)
おいくら? 92
実際の値:
92.000000 * 1.1 = 101.200000
切り捨て: 101円
四捨五入: 101円
切り上げ: 102円
切り捨て
消費税の計算は実数計算をともなうため、入力はdouble型変数に代入しています。
入力値が92だとすると消費税10%の場合、税込価格は
92×1.1=101.2
となります。
C言語の変数のキャスト(一時的な型変換のこと ※後述「キャストとは」参照)を利用すると切り捨てをすることができます。
計算結果をint型にキャストすると整数部分のみが取り出せ切り捨てが実現できます。
例えば
(int)101.2
とすると結果は101となります。(int型は小数点以下が表せないため、結果的に切り捨てになります)
サンプルコードでは変数priceに入力された値を以下のように計算して切り捨て結果を表示しています。
/* 切り捨て */ down = (int)(price * 1.1); printf("切り捨て: %d円\n", down);
四捨五入
基本的な式は切り捨てと同じですが、計算結果に0.5を足してからint型にキャストすることで四捨五入を実現できます。
/* 四捨五入 */ rounding = (int)(price * 1.1 + 0.5); printf("四捨五入: %d円\n", rounding);
四捨五入の考え方です。
まずは四捨の方ですが、計算結果の小数点部分が0.1~0.4だと0.5を足しても0.6~0.9となるためint型にキャストしてしまえば結果的に1の位の桁は変化しません。
五入の方は、計算結果の小数点部分が0.5~0.9だと0.5を足すと1.0~1.4となり、int型にキャストしたとき1の位が+1されます。0.5を足すこととint型へのキャストを利用することで四捨五入が実現できます。
切り上げ
サンプルコードでは、計算結果に0.999999を足すことで切り上げを実現しています。
/* 切り上げ */ up = (int)(price * 1.1 + 0.999999); printf("切り上げ: %d円\n", up);
本当は0.999999…(循環小数)を足したいところです。
というのも消費税の計算結果が、123.0000001などとなった場合は、0.999999を足しても123.9999991となってしまいint型にキャストしても切り上げとならないためです。
ただ現在の消費税率であれば、消費税の計算結果が101.2とか123.7などと小数点以下1桁におさまるため、問題なく切り上げが実現できます。
math.hで定義された数学関数(floor, round, ceil)を使う方法
計算式が面倒!という方は素直にC言語の数学関数のお世話になりましょう。
この方法の前提として数学関数を利用できるmath.hをヘッダファイルで取り込む必要があります。
#include <math.h>
ソースコード
zeikomi_math.c
/*
税込価格で切り捨て・四捨五入・切り上げを行う
※C言語のmath.h関数を利用する
*/
#include <stdio.h>
#include <math.h>
int main(void){
double price, tax_price; /* 入力金額、税込価格 */
/* 金額を入力 */
printf("おいくら? ");
scanf("%lf", &price);
/* 実際の値 */
printf("\n実際の値:\n");
printf("%f * 1.1 = %f\n\n", price, price * 1.1);
/* 税込価格を計算(実数) */
tax_price = price * 1.1;
/* 切り捨て */
printf("切り捨て: %.1f円\n", floor(tax_price));
/* 四捨五入 */
printf("四捨五入: %.1f円\n", round(tax_price));
/* 切り上げ */
printf("切り上げ: %.1f円\n", ceil(tax_price));
return 0;
}
実行イメージ(キーボードから92と入力した場合のイメージです。適当な金額を入力してください)
おいくら? 92
実際の値:
92.000000 * 1.1 = 101.200000
切り捨て: 101.0円
四捨五入: 101.0円
切り上げ: 102.0円
数学関数を利用した場合、最初に紹介した例と違って得られる数値が全てdouble型のためprintf関数で小数点以下1桁までを念のため表示するようにしています。
printf("四捨五入: %.1f円\n", round(tax_price));
切り捨て
数学関数のfloor()を使います。(ちなみにfloorは床と言う意味です)
floor関数には引数として実数(double型)を指定します。
floor(N)の意味は、はN以下の最大整数をdouble型で返す、という意味になります。
例えば
floor(123.4)
とした場合、123.0が戻り値として返ります。
floor関数の引数に消費税の計算結果を指定することで結果的に切り捨てを行うことが出来ます。
サンプルでは、消費税の計算結果である変数tax_priceをfloorの引数に指定することで切り捨てを行っています。
/* 税込価格を計算(実数) */ tax_price = price * 1.1; /* 切り捨て */ printf("切り捨て: %.1f円\n", floor(tax_price));
四捨五入
数学関数のround()を使います。
round関数もfloor関数と同じく、引数に指定できる値はdouble型となります。
round(N)は、Nを小数点以下で四捨五入した値をdouble型で返すという意味になります。
例えば、
round(1.4)
round(1.5)
とした場合、それぞれ1.0と2.0が返ります。結果的に四捨五入をしたことになります。
サンプルでは、以下のように利用しています。
/* 税込価格を計算(実数) */ tax_price = price * 1.1; : : /* 四捨五入 */ printf("四捨五入: %.1f円\n", round(tax_price));
切り上げ
数学関数のceil()を使います。
引数に指定できる値は、これまでの関数と同様にdouble型です。
ceil(N)は、N以上の最小整数をdouble型で返す、という意味です。
例えば、
ceil(3.14)
とすると4.0が返ります。結果的に切り上げをしていることになります。
サンプルでは、以下のように利用しています。
/* 税込価格を計算(実数) */ tax_price = price * 1.1; : : /* 切り上げ */ printf("切り上げ: %.1f円\n", ceil(tax_price));
以上、C言語で切り捨て・四捨五入・切り上げを行う2種類の方法を紹介してきました。
どちらを使うかは、もちろんご自身で決めてもらって結構です。
わたしとしては、最初に紹介した計算式を使って0.5を足してint型にキャストして四捨五入する…みたいな方法がプログラミングっぽくと面白いなあ、と思います。
コメント