業務常見需求:金額保留 2 位小數、分頁計算向上取整、統計向下取整。MySQL 提供四大函數覆蓋所有場景。
| 函數 | 語法 | 行為 | 返回類型 | 典型場景 |
|---|---|---|---|---|
ROUND | ROUND(X) / ROUND(X,D) | 四捨五入到整數或 D 位小數 | BIGINT / DECIMAL | 金額計算、評分顯示 |
FLOOR | FLOOR(X) | 向下取整(不大於 X 的最大整數) | BIGINT | 分頁總頁數、索引下界 |
CEILING / CEIL | CEILING(X) | 向上取整(不小於 X 的最小整數) | BIGINT | 分頁總頁數、批次數 |
TRUNCATE | TRUNCATE(X,D) | 截斷到 D 位小數(不四捨五入) | DECIMAL | 強制保留小數位、去尾 |
-- ROUND
SELECT ROUND(1.23); -- 1
SELECT ROUND(1.58); -- 2
SELECT ROUND(-1.58); -- -2
SELECT ROUND(1.298, 1); -- 1.3
SELECT ROUND(1.298, 0); -- 1
-- FLOOR
SELECT FLOOR(1.23); -- 1
SELECT FLOOR(-1.23); -- -2 (注意負數方向)
-- CEILING
SELECT CEILING(1.23); -- 2
SELECT CEILING(-1.23); -- -1
-- TRUNCATE
SELECT TRUNCATE(1.298, 1); -- 1.2
SELECT TRUNCATE(1.298, 0); -- 1
SELECT TRUNCATE(-1.298, 1); -- -1.2
FLOAT/DOUBLE 存儲為近似值,ROUND(1.235, 2) 可能得 1.23 而非 1.24。金額欄位務必用 DECIMAL(10,2)。ROUND 採用「四捨五入,五向偶數」(Banker's Rounding)。ROUND(1.5) = 2, ROUND(2.5) = 2。若需傳統「五進一」,用 TRUNCATE(X + 0.5, 0) 或應用層處理。FLOOR(-1.2) = -2、CEILING(-1.2) = -1,符合數學定義,業務邏輯需確認方向。CEILING(total_rows / page_size) 或 (total_rows + page_size - 1) DIV page_size。SELECT FORMAT(1234567.89, 2); -- '1,234,567.89' (含千分位,字串類型)
SELECT CONCAT('¥', FORMAT(price, 2)); -- 前端直用