ORACLEには端数処理関数がいくつかあります。似た機能の関数もあります。正しく使い分けられていますか?
TRUNC・ROUND
TRUNCは、端数の切捨てを行う関数です。
ROUNDは、端数を四捨五入を行う関数です。(銀行丸めではないので注意)
SELECT a,TRUNC(a),ROUND(a) FROM test_table;
A TRUNC(A) ROUND(A)
---------- ---------- ----------
5.4 5 5
5.5 5 6
-5.4 -5 -5
-5.5 -5 -6
CEIL・FLOOR
CEILは、端数の切上げを行う関数です。負数の場合に注意、大きい方へ丸めます。
FLOORは、端数の切捨てを行う関数です。負数の場合に注意、小さい方へ丸めます。
SELECT a,CEIL(a),FLOOR(a) FROM test_table;
A CEIL(A) FLOOR(A)
---------- ---------- ----------
5.4 6 5
5.5 6 5
-5.4 -5 -6
-5.5 -5 -6
TRUNC・ROUNDとCEIL・FLOORの違い
違いの1点目は、TRUNCとROUNDは、指定した桁位置で端数処理をすることが出来るのに対し、CEIL・FLOORは整数に丸めることしかできない点です。
TRUNCとROUNDの桁位置の指定は、2番目の引数で行います。0は整数に(デフォルト)、1は小数点以下1位に、-1は整数10の位に丸めることを意味します。
SELECT a,TRUNC(a),TRUNC(a,0),TRUNC(a,1),TRUNC(a,-1) FROM test_table;
A TRUNC(A) TRUNC(A,0) TRUNC(A,1) TRUNC(A,-1)
---------- ---------- ------------ ------------ ------------
55.55 55 55 55.5 50
違いの2点目は、TRUNCとFLOORの違いです。指定した桁で丸められか否かという点以外に、負数の場合の扱いが異なります。
TRUNCは、指定した値を0に近い方へ丸めます。
FLOORは、指定した値を小さい方へ丸めます。
SELECT a,TRUNC(a),FLOOR(a) FROM test_table;
A TRUNC(A) FLOOR(A)
---------- ---------- ----------
5.5 5 5
-5.5 -5 -6
負数の場合のTRUNCとFLOORの違いやCEILの挙動は、特に注意が必要です。
まとめ
端数処理は金額等の重要な項目で使用することも多く、重い障害につながる可能性があります。
ぜひ覚えておきましょう。
関連


