數值函數分類速查
| 函數 | 功能 | 語法 | 關鍵行為 |
| ABS | 絕對值 | ABS(n) | 負數轉正,正數不變 |
| CEIL | 向上取整 | CEIL(n) | ≥ n 的最小整數 |
| FLOOR | 向下取整 | FLOOR(n) | ≤ n 的最大整數 |
| ROUND | 四捨五入 | ROUND(n [, m]) | m>0 小數位,m<0 整數位,m 省略=0 |
| TRUNC | 截斷 (捨去) | TRUNC(n [, m]) | 直接切除,不進位 |
| MOD | 餘數 | MOD(m, n) | m - n*FLOOR(m/n),負數行為注意 |
| POWER | 冪次 | POWER(m, n) | m 的 n 次方 |
| SQRT | 平方根 | SQRT(n) | n ≥ 0,負數報錯 |
| SIN/COS/TAN | 三角函數 | SIN(n) 等 | 參數為弧度 |
| LN/LOG/EXP | 對數/指數 | LN(n), LOG(b,n), EXP(n) | 自然對數、指數 |
逐一實戰範例與驗證
1. ABS — 絕對值
SELECT
CEIL(3.34) ceil_pos, FLOOR(3.34) floor_pos,
CEIL(3.99) ceil_pos2, FLOOR(3.99) floor_pos2,
CEIL(-3.44) ceil_neg, FLOOR(-3.44) floor_neg,
CEIL(-5.99) ceil_neg2, FLOOR(-5.99) floor_neg2
FROM dual;
-- 結果:
-- CEIL: 4, 4, -3, -5 (向 +∞ 方向)
-- FLOOR: 3, 3, -4, -6 (向 -∞ 方向)
3. ROUND — 四捨五入 (銀行家算法: .5 向偶數)
SELECT
TRUNC(785.652) t0, -- 785
TRUNC(785.652, 2) t2, -- 785.65
TRUNC(785.652, -1) t_1, -- 780
TRUNC(785.352) t0b, -- 785
TRUNC(784.652, -1) t_1b -- 780
FROM dual;
5. ROUND vs TRUNC 關鍵差異對比
| 輸入值 | ROUND(,0) | TRUNC(,0) | ROUND(,-1) | TRUNC(,-1) |
| 785.652 | 786 | 785 | 790 | 780 |
| 785.352 | 785 | 785 | 780 | 780 |
| -785.652 | -786 | -785 | -790 | -780 |
6. MOD — 餘數運算
SELECT
POWER(2, 4) p1, -- 16
POWER(5, 3) p2, -- 125
POWER(9, 0.5) p3, -- 3 (等同 SQRT)
SQRT(16) s1, -- 4
SQRT(2) s2 -- 1.414...
FROM dual;
8. 實務應用:員工日薪計算 (保留 2 位小數)
-- 移植代碼時必須注意!
SELECT MOD(-10, 3) FROM dual; -- Oracle: 2
-- Python: -10 % 3 = 2 (同號)
-- C: -10 % 3 = -1 (同被除數)
2. ROUND 銀行家算法
-- 兩日期相減得數值 (天數,含小數)
SELECT SYSDATE - HIREDATE AS days_diff FROM emp WHERE empno = 7369;
-- 加減天數
SELECT SYSDATE + 30 AS after_30_days FROM dual;
-- 月份運算用 ADD_MONTHS,不可直接加減數值
總結
掌握 ROUND/TRUNC 進位與截斷差異、CEIL/FLOOR 方向性、MOD 負數行為、NUMBER 精度特性,是撰寫正確數值計算 SQL/PLSQL 的基礎。實務中**金融/會計計算嚴禁浮點數**,善用 ROUND(,2) 控制匯率/利率精度,並建立共用函數庫統一處理邊界情況。