Oracle で小数点以下を切り上げるには CEIL 関数を使います。しかし「CEIL で小数第 2 位に切り上げたい」「消費税の 1 円未満を切り上げたい」「負の数を切り上げたら想定と違う結果になった」といった疑問に直面することも多いのではないでしょうか。
実は CEIL は常に整数への切り上げしかできません。任意の桁で切り上げるには数式テクニックが必要です。
本記事では、CEIL 関数の基本動作から、任意の小数桁・整数桁での切り上げ数式、負の数の動作、FLOOR・TRUNC・ROUND との違い、そしてページネーション・梱包計算・消費税・時間単位料金などの実務パターンまで体系的に解説します。
・CEIL 関数の基本構文と動作
・CEIL は「整数への切り上げ」のみという制約
・小数第 n 位での切り上げテクニック(CEIL(n * 100) / 100 パターン)
・十の位・百の位・千の位への切り上げテクニック
・負の数での CEIL の動作(0 方向への丸め)
・CEIL と FLOOR / TRUNC / ROUND の違い
・ページネーション・梱包計算・消費税・時間単位料金の実務パターン
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 を返す(エラーにならない) |
ROUND のような桁数指定パラメータは存在しません。
CEIL(2.345, 2) のような書き方はエラーになります。小数第 n 位で切り上げたい場合は、後述する数式テクニックを使います。負の数での CEIL の動作
CEIL は数学的には「引数以上の最小の整数」を返す関数です。負の数の場合、0 に近い方向に丸められるため、直感に反する結果になることがあります。
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(0 に近い整数)と TRUNC(小数部を捨てる)は同じ方向に丸めるため、結果が一致します。一方、FLOOR は必ず数直線上で左(-∞ 方向)に丸めます。「絶対値を切り上げたい」(-2.3 → -3)場合は
-CEIL(ABS(n)) * SIGN(n) のように符号を分離して処理する方法もあります。任意の小数桁で切り上げる方法
CEIL には桁数指定がないため、小数第 n 位で切り上げるには「桁をずらして → CEIL → 桁を戻す」という数式テクニックを使います。
-- 公式: 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 → 桁を復元」という逆のテクニックを使います。
-- 十の位で切り上げ(一の位以下を切り上げ) 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 件で表示したら何ページ必要か」を計算します。
-- 総件数 ÷ ページサイズ → 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ページ)
パターン②:梱包・配送の箱数計算
-- 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 円未満切り上げ
-- 税抜価格 × 税率 の 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)
日本の消費税法では端数処理の方法は規定されておらず、切り上げ・切り捨て・四捨五入のいずれも認められています。会計システムの仕様に合わせて使い分けてください。
パターン④:時間単位での料金切り上げ
-- 駐車時間(分)を 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 位で切り上げた金額を表示する
-- 小数第 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)
頻繁に使う場合は、桁数を指定できるカスタム関数を作成すると便利です。
-- 任意の桁数で切り上げるカスタム関数
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 / 分析クエリでの活用
-- 金額帯で集計(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;
よくある質問
CEIL(n * POWER(10, d)) / POWER(10, d) の数式を使います。ROUND や TRUNC のように桁数パラメータを受け取る構文はありません。CEIL(NULL) は NULL を返します。NVL で事前にデフォルト値を設定する必要はありませんが、NULL の可能性がある列で CEIL を使う場合は結果が NULL になることを考慮してください。-CEIL(ABS(n))(常に負の結果)または SIGN(n) * CEIL(ABS(n))(符号を保持)を使います。負の方向(-∞ 方向)に丸めたい場合は FLOOR を使ってください。CEIL(3.0) = FLOOR(3.0) = 3 です。小数部が 0 でなければ、CEIL は必ず FLOOR + 1 の値を返します。TO_CHAR(CEIL(n), 'FM999990.00') で書式を指定すれば「3.00」と表示できます。詳細は「小数点以下の0が消える原因と表示する方法」を参照してください。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)の詳細は「小数点以下の切り捨てを行う方法」も併せて参照してください。
