【Oracle】CEIL関数で小数点以下を切り上げる方法|任意桁での切り上げ・負の数・ページネーション・消費税計算まで解説

【Oracle】CEIL関数で小数点以下を切り上げる方法|任意桁での切り上げ・負の数・ページネーション・消費税計算まで解説 Oracle

Oracle で小数点以下を切り上げるには CEIL 関数を使います。しかし「CEIL で小数第 2 位に切り上げたい」「消費税の 1 円未満を切り上げたい」「負の数を切り上げたら想定と違う結果になった」といった疑問に直面することも多いのではないでしょうか。

実は CEIL常に整数への切り上げしかできません。任意の桁で切り上げるには数式テクニックが必要です。

本記事では、CEIL 関数の基本動作から、任意の小数桁・整数桁での切り上げ数式負の数の動作FLOOR・TRUNC・ROUND との違い、そしてページネーション・梱包計算・消費税・時間単位料金などの実務パターンまで体系的に解説します。

この記事でわかること
・CEIL 関数の基本構文と動作
・CEIL は「整数への切り上げ」のみという制約
・小数第 n 位での切り上げテクニック(CEIL(n * 100) / 100 パターン)
・十の位・百の位・千の位への切り上げテクニック
・負の数での CEIL の動作(0 方向への丸め)
・CEIL と FLOOR / TRUNC / ROUND の違い
・ページネーション・梱包計算・消費税・時間単位料金の実務パターン
スポンサーリンク

CEIL 関数の基本

SQL(CEIL の基本構文)
-- 構文
CEIL( 数値 )

-- 引数の数値以上で最小の整数を返す(天井関数)
SELECT CEIL(2.1)   AS result FROM dual;  -- 3
SELECT CEIL(2.9)   AS result FROM dual;  -- 3
SELECT CEIL(3.0)   AS result FROM dual;  -- 3(ちょうど整数ならそのまま)
SELECT CEIL(0.001) AS result FROM dual;  -- 1

CEIL(ceiling = 天井)は、引数の値以上で最も小さい整数を返します。小数部分が 0 でない限り、必ず次の整数に繰り上がります。

入力値 CEIL の結果 説明
2.1 3 2.1 以上の最小整数 = 3
2.9 3 2.9 以上の最小整数 = 3
3.0 3 ちょうど整数なのでそのまま
0.001 1 0.001 以上の最小整数 = 1
-2.1 -2 -2.1 以上の最小整数 = -2(0 に近い方)
-2.9 -2 -2.9 以上の最小整数 = -2(0 に近い方)
-3.0 -3 ちょうど整数なのでそのまま
0 0 ゼロはそのまま
NULL NULL NULL を返す(エラーにならない)
CEIL は「整数への切り上げ」のみ
ROUND のような桁数指定パラメータは存在しません。CEIL(2.345, 2) のような書き方はエラーになります。小数第 n 位で切り上げたい場合は、後述する数式テクニックを使います。

負の数での CEIL の動作

CEIL は数学的には「引数以上の最小の整数」を返す関数です。負の数の場合、0 に近い方向に丸められるため、直感に反する結果になることがあります。

SQL(負の数の CEIL)
SELECT
    CEIL(-2.3)  AS ceil_neg,     -- -2(-2.3 以上の最小整数 = -2)
    FLOOR(-2.3) AS floor_neg,    -- -3(-2.3 以下の最大整数 = -3)
    TRUNC(-2.3) AS trunc_neg,    -- -2(小数部を切り捨て = -2)
    ROUND(-2.3) AS round_neg     -- -2(四捨五入 = -2)
FROM dual;
入力値 CEIL FLOOR TRUNC ROUND 数直線上の方向
-2.3 -2 -3 -2 -2 CEIL: →0方向 / FLOOR: →-∞方向
-2.7 -2 -3 -2 -3 CEIL: →0方向 / FLOOR: →-∞方向
-3.0 -3 -3 -3 -3 ちょうど整数なので全関数同じ
CEIL と TRUNC は負の数で同じ結果になることが多い
負の数では CEIL(0 に近い整数)と TRUNC(小数部を捨てる)は同じ方向に丸めるため、結果が一致します。一方、FLOOR は必ず数直線上で左(-∞ 方向)に丸めます。「絶対値を切り上げたい」(-2.3 → -3)場合は -CEIL(ABS(n)) * SIGN(n) のように符号を分離して処理する方法もあります。

任意の小数桁で切り上げる方法

CEIL には桁数指定がないため、小数第 n 位で切り上げるには「桁をずらして → CEIL → 桁を戻す」という数式テクニックを使います。

SQL(小数第 n 位で切り上げる数式)
-- 公式: CEIL(n * 10^d) / 10^d
-- d = 残したい小数桁数

-- 小数第 1 位で切り上げ(小数第 2 位以下を切り上げ)
SELECT CEIL(2.341 * 10) / 10 AS result FROM dual;     -- 2.4

-- 小数第 2 位で切り上げ(小数第 3 位以下を切り上げ)
SELECT CEIL(2.341 * 100) / 100 AS result FROM dual;   -- 2.35

-- 小数第 3 位で切り上げ
SELECT CEIL(2.3411 * 1000) / 1000 AS result FROM dual; -- 2.342

-- POWER 関数を使った汎用形(d を変数にできる)
SELECT CEIL(2.341 * POWER(10, 2)) / POWER(10, 2) AS result FROM dual; -- 2.35
入力値 切り上げ桁 数式 結果
2.341 小数第 1 位 CEIL(2.341 * 10) / 10 2.4
2.341 小数第 2 位 CEIL(2.341 * 100) / 100 2.35
2.341 小数第 3 位 CEIL(2.341 * 1000) / 1000 2.342
2.300 小数第 1 位 CEIL(2.300 * 10) / 10 2.3(ちょうどの値はそのまま)
123.456 整数位 CEIL(123.456) 124
浮動小数点の丸め誤差に注意
Oracle の NUMBER 型は十進演算なので通常は問題ありませんが、BINARY_FLOAT / BINARY_DOUBLE 型(IEEE 754 浮動小数点)を使っている場合は掛け算の段階で微小な誤差が生じ、意図しない切り上げが起きることがあります。金額計算では必ず NUMBER 型を使用してください。

十の位・百の位・千の位で切り上げる方法

整数部分のより大きな桁で切り上げるには、「桁を縮小 → CEIL → 桁を復元」という逆のテクニックを使います。

SQL(十の位・百の位・千の位で切り上げ)
-- 十の位で切り上げ(一の位以下を切り上げ)
SELECT CEIL(123 / 10) * 10 AS result FROM dual;       -- 130

-- 百の位で切り上げ(十の位以下を切り上げ)
SELECT CEIL(123 / 100) * 100 AS result FROM dual;     -- 200

-- 千の位で切り上げ
SELECT CEIL(1234 / 1000) * 1000 AS result FROM dual;  -- 2000

-- ちょうど割り切れる場合はそのまま
SELECT CEIL(200 / 100) * 100 AS result FROM dual;     -- 200

-- POWER を使った汎用形
SELECT CEIL(1234 / POWER(10, 2)) * POWER(10, 2) AS result FROM dual; -- 1300
入力値 切り上げ単位 数式 結果
123 十の位 CEIL(123 / 10) * 10 130
123 百の位 CEIL(123 / 100) * 100 200
1234 千の位 CEIL(1234 / 1000) * 1000 2000
200 百の位 CEIL(200 / 100) * 100 200(ちょうどはそのまま)
1501 百の位 CEIL(1501 / 100) * 100 1600

CEIL と FLOOR / TRUNC / ROUND の違い

4 つの丸め関数の違いを整数の丸めで比較します。

入力値 CEIL(切り上げ) FLOOR(切り下げ) TRUNC(切り捨て) ROUND(四捨五入)
2.3 3 2 2 2
2.5 3 2 2 3
2.7 3 2 2 3
3.0 3 3 3 3
-2.3 -2 -3 -2 -2
-2.5 -2 -3 -2 -3
-2.7 -2 -3 -2 -3
関数 丸め方向 桁指定 主な用途
CEIL +∞ 方向(常に大きい整数へ) なし(整数のみ) 必要数量の計算・ページ数の算出
FLOOR -∞ 方向(常に小さい整数へ) なし(整数のみ) 下限の計算・バケット分類
TRUNC 0 方向(小数部を捨てる) あり(桁数指定可) 金額の端数切り捨て・日付の切り捨て
ROUND 最も近い値に丸める あり(桁数指定可) 四捨五入・一般的な丸め処理

ROUND 関数の桁指定や日付への適用など詳細は「ROUND関数の全機能完全ガイド」を参照してください。

実務パターン集

パターン①:ページネーション(総ページ数の計算)

CEIL の最も一般的な使い方です。「全 57 件のデータを 1 ページ 10 件で表示したら何ページ必要か」を計算します。

SQL(ページネーション)
-- 総件数 ÷ ページサイズ → CEIL で切り上げ = 総ページ数
SELECT CEIL(57 / 10) AS total_pages FROM dual;  -- 6(60件分 = 6ページ必要)

-- テーブルから動的に計算
SELECT CEIL(COUNT(*) / :page_size) AS total_pages
FROM orders;

-- ちょうど割り切れる場合
SELECT CEIL(50 / 10) AS total_pages FROM dual;  -- 5(ちょうど5ページ)

パターン②:梱包・配送の箱数計算

SQL(梱包数量の計算)
-- 1箱に12個入る場合、注文数に必要な箱数は?
SELECT
    order_id,
    quantity,
    CEIL(quantity / 12) AS boxes_needed
FROM order_details;

-- 結果例:
-- quantity=25 → CEIL(25/12) = 3箱(24個+1個で3箱必要)
-- quantity=24 → CEIL(24/12) = 2箱(ちょうど2箱)
-- quantity=1  → CEIL(1/12)  = 1箱(1個でも1箱必要)

パターン③:消費税の 1 円未満切り上げ

SQL(消費税の切り上げ計算)
-- 税抜価格 × 税率 の 1 円未満を切り上げ
SELECT
    product_name,
    price_excl_tax,
    CEIL(price_excl_tax * 0.10) AS tax_ceil,     -- 消費税(1円未満切り上げ)
    price_excl_tax + CEIL(price_excl_tax * 0.10) AS price_incl_tax
FROM products;

-- 結果例:
-- price_excl_tax=980 → 税=CEIL(98.0)=98    → 税込1078
-- price_excl_tax=298 → 税=CEIL(29.8)=30    → 税込328
-- price_excl_tax=100 → 税=CEIL(10.0)=10    → 税込110

-- 注意: 企業の会計規則により切り捨て(TRUNC)や四捨五入(ROUND)を使う場合もある
-- 切り捨て: TRUNC(price_excl_tax * 0.10)
-- 四捨五入: ROUND(price_excl_tax * 0.10)
消費税の端数処理は企業ごとに異なる
日本の消費税法では端数処理の方法は規定されておらず、切り上げ・切り捨て・四捨五入のいずれも認められています。会計システムの仕様に合わせて使い分けてください。

パターン④:時間単位での料金切り上げ

SQL(駐車場料金: 30分単位で切り上げ)
-- 駐車時間(分)を 30 分単位に切り上げて料金計算
SELECT
    car_id,
    parking_minutes,
    CEIL(parking_minutes / 30) AS units,          -- 30分単位数
    CEIL(parking_minutes / 30) * 200 AS charge    -- 1単位200円
FROM parking_log;

-- 結果例:
-- parking_minutes=45  → CEIL(45/30)=2単位  → 400円
-- parking_minutes=60  → CEIL(60/30)=2単位  → 400円(ちょうど)
-- parking_minutes=61  → CEIL(61/30)=3単位  → 600円
-- parking_minutes=10  → CEIL(10/30)=1単位  → 200円

パターン⑤:小数第 2 位で切り上げた金額を表示する

SQL(任意桁の切り上げ + TO_CHAR で表示整形)
-- 小数第 2 位で切り上げ + カンマ付き表示
SELECT
    product_name,
    unit_price,
    discount_rate,
    CEIL(unit_price * (1 - discount_rate) * 100) / 100 AS discounted_price,
    TO_CHAR(
        CEIL(unit_price * (1 - discount_rate) * 100) / 100,
        'FM999,999,990.00'
    ) AS formatted_price
FROM products;

-- unit_price=1234.567, discount_rate=0.15 の場合:
-- 1234.567 * 0.85 = 1049.38195
-- CEIL(1049.38195 * 100) / 100 = 1049.39
-- 表示: '1,049.39'

TO_CHAR の数値書式モデルについては「小数点以下の0が消える原因と表示する方法」を参照してください。

任意桁の切り上げを関数化する(PL/SQL)

頻繁に使う場合は、桁数を指定できるカスタム関数を作成すると便利です。

SQL(汎用切り上げ関数)
-- 任意の桁数で切り上げるカスタム関数
CREATE OR REPLACE FUNCTION ceil_at(
    p_value  IN NUMBER,
    p_digits IN NUMBER DEFAULT 0  -- 残す小数桁数(負で整数桁)
) RETURN NUMBER
IS
    v_factor NUMBER := POWER(10, p_digits);
BEGIN
    RETURN CEIL(p_value * v_factor) / v_factor;
END ceil_at;
/

-- 使用例
SELECT ceil_at(2.345, 2)  FROM dual;  -- 2.35(小数第2位で切り上げ)
SELECT ceil_at(2.345, 1)  FROM dual;  -- 2.4(小数第1位で切り上げ)
SELECT ceil_at(2.345, 0)  FROM dual;  -- 3(整数へ切り上げ = CEIL と同じ)
SELECT ceil_at(1234, -2)  FROM dual;  -- 1300(百の位で切り上げ)
SELECT ceil_at(1234, -3)  FROM dual;  -- 2000(千の位で切り上げ)
桁数パラメータの解釈
p_digits = 2: 小数第 2 位まで残す(小数第 3 位以下を切り上げ)
p_digits = 0: 整数にする(= 通常の CEIL)
p_digits = -1: 十の位に切り上げ
p_digits = -2: 百の位に切り上げ
ROUND / TRUNC の桁指定と同じ考え方です。

GROUP BY / 分析クエリでの活用

SQL(GROUP BY と CEIL の組み合わせ)
-- 金額帯で集計(1000円単位で切り上げ → 金額帯ラベル)
SELECT
    CEIL(amount / 1000) * 1000 AS amount_band,
    COUNT(*) AS order_count,
    SUM(amount) AS total_amount
FROM orders
GROUP BY CEIL(amount / 1000) * 1000
ORDER BY amount_band;

-- 結果例:
-- amount_band=1000  → 1円〜1000円の注文
-- amount_band=2000  → 1001円〜2000円の注文
-- amount_band=5000  → 4001円〜5000円の注文

-- 年齢帯での集計(10歳刻みで切り上げ)
SELECT
    CEIL(age / 10) * 10 AS age_band,
    COUNT(*) AS user_count
FROM users
GROUP BY CEIL(age / 10) * 10
ORDER BY age_band;

よくある質問

QCEIL に桁数を指定できますか?(CEIL(2.345, 2) のように)
Aできません。CEIL は引数 1 つだけで、常に整数への切り上げを行います。小数第 n 位で切り上げたい場合は CEIL(n * POWER(10, d)) / POWER(10, d) の数式を使います。ROUND や TRUNC のように桁数パラメータを受け取る構文はありません。
QCEIL(NULL) はエラーになりますか?
Aエラーにはなりません。CEIL(NULL)NULL を返します。NVL で事前にデフォルト値を設定する必要はありませんが、NULL の可能性がある列で CEIL を使う場合は結果が NULL になることを考慮してください。
Q負の数を「絶対値で切り上げ」したいです(-2.3 → -3)
ACEIL(-2.3) は -2 を返します(0 に近い方向)。絶対値を切り上げてから符号を戻すには -CEIL(ABS(n))(常に負の結果)または SIGN(n) * CEIL(ABS(n))(符号を保持)を使います。負の方向(-∞ 方向)に丸めたい場合は FLOOR を使ってください。
QCEIL と FLOOR の結果が同じになるのはどんなとき?
A入力値がちょうど整数のときだけ同じ結果になります。CEIL(3.0) = FLOOR(3.0) = 3 です。小数部が 0 でなければ、CEIL は必ず FLOOR + 1 の値を返します。
QCEIL を使うと小数点以下の 0 が消えて「3」になります。「3.00」と表示したいです
ACEIL は NUMBER 型を返すため、末尾のゼロは表示されません。TO_CHAR(CEIL(n), 'FM999990.00') で書式を指定すれば「3.00」と表示できます。詳細は「小数点以下の0が消える原因と表示する方法」を参照してください。
QBINARY_FLOAT 型で CEIL を使うと結果がおかしいです
ABINARY_FLOAT / BINARY_DOUBLE は IEEE 754 浮動小数点型で、十進数では正確に表現できない値があります(例: 0.1 が 0.10000000149… になる)。CEIL がこの微小な誤差を拾って意図しない切り上げが起きます。金額計算では必ず NUMBER 型を使ってください。

まとめ

Oracle の CEIL 関数と切り上げ処理の要点をまとめます。

やりたいこと 使う式
整数への切り上げ(基本) CEIL(n)
小数第 1 位で切り上げ CEIL(n * 10) / 10
小数第 2 位で切り上げ CEIL(n * 100) / 100
小数第 d 位で切り上げ(汎用) CEIL(n * POWER(10, d)) / POWER(10, d)
十の位で切り上げ CEIL(n / 10) * 10
百の位で切り上げ CEIL(n / 100) * 100
ページ数の計算 CEIL(total_count / page_size)
梱包数の計算 CEIL(quantity / box_capacity)
消費税の 1 円未満切り上げ CEIL(price * tax_rate)
30分単位で料金切り上げ CEIL(minutes / 30) * unit_price
金額帯での集計 GROUP BY CEIL(amount / 1000) * 1000

四捨五入(ROUND)の詳細は「ROUND関数完全ガイド」、切り捨て(TRUNC)の詳細は「小数点以下の切り捨てを行う方法」も併せて参照してください。