四大函數行為對比
| 函數 | 語法 | 行為 | 範例輸入 | 結果 |
ROUND | ROUND(n [, d]) | 四捨五入到小數點右第 d 位(d 可負) | ROUND(1.2345, 3) | 1.235 |
TRUNC | TRUNC(n [, d]) | 直接捨去小數點右第 d 位之後(不四捨五入) | TRUNC(1.2345, 2) | 1.23 |
CEIL | CEIL(n) | 回傳 ≥ n 的最小整數(向上取整) | CEIL(23.33) | 24 |
FLOOR | FLOOR(n) | 回傳 ≤ n 的最大整數(向下取整) | FLOOR(23.33) | 23 |
進階範例
-- ROUND 負數 decimals:捨入到十位、百位
ROUND(1234.56, -1) --> 1230
ROUND(1234.56, -2) --> 1200
-- TRUNC 負數 decimals:歸零到十位、百位
TRUNC(1234.56, -1) --> 1230
TRUNC(1234.56, -2) --> 1200
-- 無 decimals 參數時預設為 0(整數)
ROUND(23.33) --> 23
TRUNC(23.33) --> 23
實務應用場景
- 金融金額:會計制度常要求「捨去」而非「四捨五入」 → 用
TRUNC(amount, 2)。
- 統計報表:百分比顯示保留 2 位小數 →
ROUND(pct * 100, 2)。
- 分頁計算:
CEIL(total_rows / page_size) 取總頁數。
- 資料分桶:
FLOOR(salary / 10000) * 10000 將薪資歸入萬元區間。
效能與精度提醒
- Oracle
NUMBER 型別為可變精度(最多 38 位),上述函數均保持精度不會溢位。
BINARY_FLOAT/DOUBLE 型別若參與運算,會隱含轉換為二進位浮點數,可能產生 0.1 無法精確表示的經典問題 → 精度敏感場景堅持用 NUMBER。
- 大量資料更新時,
TRUNC 比 ROUND 微快(無四捨五入判斷),差異可忽略。