C言語のきほん|切り上げ、切り下げ、四捨五入を行う(ceil、floor、round)

小数の丸め方を正しく使い分けよう。ceil、floor、round を知ると、C言語の数値処理がぐっとわかりやすくなる

C言語で実数を扱っていると、小数点以下をどのように処理するかが大切になる場面がよくあります。
たとえば、料金を計算したあとに端数を切り上げたい、個数の計算で小数を切り捨てたい、表示のために四捨五入したい、といった場面です。

このようなときに役立つのが、数学関数の ceil、floor、round です。

  • ceil は切り上げ
  • floor は切り下げ
  • round は四捨五入

を行う関数です。

ただし、ここで注意したいのは、これらの関数は「小数点以下をなんとなく処理する関数」ではなく、数学的にきちんと定義された丸め方をする関数だという点です。
特に、負の数に対する ceil と floor の動きは、最初は直感とずれて見えることがあります。

たとえば、2.2 に対して ceil を使うと 3.0 になります。
これはイメージしやすいですね。
でも、-2.2 に対して ceil を使うと -2.0 になります。
同じ「切り上げ」という言葉でも、負の数では感覚的に迷いやすいので、数直線のどちら向きに丸めるのかをしっかり理解することが大切です。

この節では、ceil、floor、round の使い方だけでなく、

  • それぞれの関数の意味
  • 正の数と負の数でどう結果が変わるのか
  • 返り値の型
  • サンプルプログラムの読み方
  • 使い分けの考え方

まで、順番にやさしく見ていきます。

小数の丸めは、見た目には小さなテーマに思えるかもしれません。
でも、料金計算、座標計算、個数計算、表示処理など、いろいろな場面でとても重要です。
ここで基本をしっかり押さえておくと、数値処理のプログラムがぐっと安定して書きやすくなります。

ceil、floor、round はどんな関数か

小数点以下を丸めたいときには、math.h に用意されている関数を使います。
まずは、次のヘッダファイルをインクルードします。

#include <math.h>

3つの関数の役割を先に整理すると、次のようになります。

関数名役割
ceilx 以上の最小の整数へ丸めるceil(2.2) → 3.0
floorx 以下の最大の整数へ丸めるfloor(2.2) → 2.0
round最も近い整数へ丸めるround(2.2) → 2.0

この表だけだと少し難しく感じるかもしれません。
そこで、それぞれを1つずつやさしく見ていきましょう。

ceil 関数とは

ceil は、x 以上の最小の整数値を求める関数です。

関数宣言

#include <math.h>

double ceil(double x);

機能

x 以上の最小の整数値を計算します。

返却値

double 型で表した、x 以上の最小の整数値を返します。

使用例

double x1 = 2.2;
double x2 = -2.2;
double y1 = ceil(x1);
double y2 = ceil(x2);

この場合の結果は次のようになります。

入力結果
2.23.0
-2.2-2.0

ceil の意味を数直線で考える

ceil は「切り上げ」と説明されますが、より正確には、その値以上でいちばん小さい整数を選ぶ関数です。

たとえば、2.2 以上の整数を考えると、

  • 3
  • 4
  • 5

があります。この中で最小なのは 3 です。
だから ceil(2.2) は 3.0 になります。

一方、-2.2 以上の整数を考えると、

  • -2
  • -1
  • 0

があります。この中で最小なのは -2 です。
だから ceil(-2.2) は -2.0 になります。

ここが、負の数で迷いやすいポイントです。
-2.2 は -3.0 に近いようにも感じますが、ceil は「以上の最小整数」を求めるので、答えは -2.0 です。

floor 関数とは

floor は、x 以下の最大の整数値を求める関数です。

関数宣言

#include <math.h>

double floor(double x);

機能

x 以下の最大の整数値を計算します。

返却値

double 型で表した、x 以下の最大の整数値を返します。

使用例

double x1 = 2.2;
double x2 = -2.2;
double y1 = floor(x1);
double y2 = floor(x2);

この場合の結果は次のようになります。

入力結果
2.22.0
-2.2-3.0

floor の意味を数直線で考える

floor は「切り下げ」と説明されますが、より正確には、その値以下でいちばん大きい整数を選ぶ関数です。

たとえば、2.2 以下の整数を考えると、

  • 0
  • 1
  • 2

があります。この中で最大なのは 2 です。
だから floor(2.2) は 2.0 になります。

一方、-2.2 以下の整数を考えると、

  • -4
  • -3

があります。この中で最大なのは -3 です。
だから floor(-2.2) は -3.0 になります。

負の数のとき、floor は「より小さい側」へ行くので、-2.0 ではなく -3.0 になる点に注意が必要です。

round 関数とは

round は、最も近い整数値に丸める関数です。
一般的に、四捨五入として理解するとわかりやすいです。

関数宣言

#include <math.h>

double round(double x);

機能

x を最も近い整数値に丸めます。

返却値

丸めた整数値を double 型で返します。

使用例

double x1 = 2.2;
double x2 = -2.2;
double y1 = round(x1);
double y2 = round(x2);

結果は次のようになります。

入力結果
2.22.0
-2.2-2.0

round の考え方

round は、入力値に最も近い整数へ丸めます。
そのため、

  • 2.2 は 2 に近いので 2.0
  • 2.7 は 3 に近いので 3.0
  • -2.2 は -2 に近いので -2.0
  • -2.7 は -3 に近いので -3.0

となります。

3つの違いを表で整理する

同じ入力でも、ceil、floor、round では結果が変わります。
これを表で見ると違いがはっきりします。

入力値ceilfloorround
6.77.06.07.0
6.27.06.06.0
-6.7-6.0-7.0-7.0
-6.2-6.0-7.0-6.0

この表から、特に負の数での動きが違うことがよくわかります。

この図では、2.2 と -2.2 に対して、ceil、floor、round がそれぞれどこへ丸めるのかを数直線で示しています。
正の数よりも、負の数での動きの違いがよく見えるのがポイントです。
ceil は上方向、floor は下方向、と単純に覚えるよりも、「以上の最小整数」「以下の最大整数」として理解したほうが確実です。

シンプルなサンプルプログラム

入力した数値について、切り上げ、切り下げ、四捨五入の結果を表示するプログラムです。

ファイル名:12_12_1.c

#include <stdio.h>
#include <math.h>

int main(void)
{
    double value;
    double up_result;
    double down_result;
    double nearest_result;

    printf("小数を入力してください> ");
    scanf("%lf", &value);

    /* 切り上げを行う */
    up_result = ceil(value);
    printf("切り上げ結果: %.1f\n", up_result);

    /* 切り下げを行う */
    down_result = floor(value);
    printf("切り下げ結果: %.1f\n", down_result);

    /* 四捨五入を行う */
    nearest_result = round(value);
    printf("四捨五入結果: %.1f\n", nearest_result);

    return 0;
}

実行例

正の数を入力した場合

小数を入力してください> 6.7
切り上げ結果: 7.0
切り下げ結果: 6.0
四捨五入結果: 7.0

負の数を入力した場合

小数を入力してください> -6.7
切り上げ結果: -6.0
切り下げ結果: -7.0
四捨五入結果: -7.0

この結果を見ると、ceil と floor は、負の数で直感とずれやすいことが確認できます。

このプログラムのポイント

この例では、入力値に対して 3つの丸め関数を順番に適用しています。

ceil は「上に丸める」ではなく「以上の最小整数」

正の数では「上に丸める」と考えても大きく外れません。
でも、負の数ではそのイメージだけだと混乱しやすいです。
数学的な定義で理解するのが大切です。

floor は「下に丸める」ではなく「以下の最大整数」

こちらも同じです。
特に -2.2 に対して -3.0 になる点が重要です。

round は最も近い整数を返す

四捨五入と考えるとわかりやすいですが、結果は double 型で返ってきます。
そのため、表示するときは整数っぽく見えても、型としては double です。

どんな場面で使い分けるか

3つの関数は、目的に応じて使い分けます。

目的使う関数
端数があれば必ず繰り上げたいceil必要箱数、必要ページ数
小数部分を捨てて下側へそろえたいfloor区切り単位の計算
最も近い整数にしたいround表示用の丸め、概算値

たとえば、人数を10人ずつのグループに分けるとき、21人なら3グループ必要です。
このように「少しでも余りがあれば1つ増やしたい」なら ceil の考え方が役立ちます。

一方、「何個完成品が取れるか」のように、余りを無視する場面なら floor が向いています。

math.h とコンパイル時の注意

これらの関数を使うには math.h が必要です。

#include <math.h>

また、環境によってはコンパイル時に -lm オプションが必要なことがあります。

gcc program.c -o program -lm

環境によっては不要な場合もありますが、数学関数が使えないというエラーが出たら、この指定を確認するとよいです。

浮動小数点数の表示に注意

ceil、floor、round の結果は「整数のように見える値」ですが、型は double です。
そのため、表示時には %f を使うことが多いです。

printf("%f\n", ceil_result);

ただし、見やすくしたいなら小数点以下の桁数を調整して、

printf("%.1f\n", ceil_result);

のように書くとすっきり表示できます。

ceil、floor、round を学ぶ意味

この3つの関数を理解すると、小数点以下をどう扱うかを明確に制御できるようになります。

学べること内容
切り上げの意味ceil の数学的な意味がわかる
切り下げの意味floor の数学的な意味がわかる
四捨五入の意味round の役割がわかる
負の数の扱い正の数との違いを理解できる
数値処理の実用性料金、個数、表示などに応用できる

切り上げ、切り下げ、四捨五入は、どれも似て見える処理ですが、実際には結果が変わることがあります。
特に負の数では違いがはっきり出るので、関数名だけでなく何を基準に丸めるのかを理解して使うことが大切です。

ceil、floor、round を使い分けられるようになると、数値計算のプログラムがより正確で意図どおりに書けるようになります。