金融、報表、計費系統頻繁需要「四捨五入」、「無條件進位」、「無條件捨去」、「直接截斷」四種取整邏輯。主流資料庫均提供對應函式。
| 邏輯 | Oracle / PostgreSQL | MySQL | SQL Server | 範例(10.68 → ?) |
|---|---|---|---|---|
| 四捨五入 | ROUND(n, d) | ROUND(n, d) | ROUND(n, d) | 10.68 → 10.7 (d=1) |
| 無條件進位 | CEIL(n) | CEIL(n) / CEILING(n) | CEILING(n) | 10.68 → 11 |
| 無條件捨去 | FLOOR(n) | FLOOR(n) | FLOOR(n) | 10.68 → 10 |
| 截斷(不進位) | TRUNC(n, d) | TRUNCATE(n, d) | ROUND(n, d, 1) 第三參數=1 | 10.68 → 10.6 (d=1) |
-- 保留 2 位小數,四捨五入
SELECT ROUND(10.684, 2); -- 10.68
SELECT ROUND(10.685, 2); -- 10.69 (Banker's Rounding 行為視版本而定)
-- 保留 2 位小數,直接截斷
SELECT TRUNCATE(10.689, 2); -- 10.68 (MySQL)
SELECT TRUNC(10.689, 2); -- 10.68 (Oracle/PG)
-- 負數行為差異
SELECT FLOOR(-1.2); -- -2 (向下取整,遠離零)
SELECT CEIL(-1.2); -- -1 (向上取整,趨近零)
SELECT TRUNCATE(-1.2, 0); -- -1 (截斷,趨近零)
SELECT ROUND(price * quantity * (1 + tax_rate), 2) AS total FROM order_items;
SELECT CEIL(total_rows / page_size) AS total_pages FROM stats;
UPDATE inventory SET qty = FLOOR(qty - allocated) WHERE sku = ?;
-- 四捨五入通用
ROUND(value, decimals)
-- 截斷通用(MySQL/Oracle/PG)
TRUNCATE(value, decimals) -- MySQL
TRUNC(value, decimals) -- Oracle/PG
-- SQL Server 需用 ROUND(value, decimals, 1)
ROUND:標準四捨五入,注意銀行家圓整規則差異。CEIL/CEILING:向上取整,分頁、配額計算常用。FLOOR:向下取整,庫存、配額下限常用。TRUNCATE/TRUNC:直接截斷,金融計算避免圓整誤差首選。