MySQL 提供三大核心數值取整函數:ROUND(四捨五入)、FLOOR(向下取整)、CEILING(向上取整)。本文系統整理語法、行為差異、負數處理、精度控制與資料型別轉換陷阱,助你精準掌控數值計算。
| 函數 | 用途 | 語法 | 回傳型別 |
|---|---|---|---|
FLOOR | 向下取整(不大於 X 的最大整數) | FLOOR(X) | BIGINT |
CEILING | 向上取整(不小於 X 的最小整數) | CEILING(X) | BIGINT |
ROUND | 四捨五入(可指定小數位) | ROUND(X) / ROUND(X, D) | BIGINT / DECIMAL |
SELECT FLOOR(1.23); -- 1
SELECT FLOOR(-1.23); -- -2 (注意:負數「向下」是更小的整數)
BIGINT,若輸入為 NULL 則回傳 NULL。SELECT CEILING(1.23); -- 2
SELECT CEILING(-1.23); -- -1 (負數「向上」是更接近零的整數)
BIGINT。SELECT ROUND(1.58); -- 2
SELECT ROUND(1.23); -- 1
SELECT ROUND(-1.23); -- -1
SELECT ROUND(-1.58); -- -2
規則:絕對值小數部 ≥ 0.5 進位,否則捨去。負數同理(-1.58 → -2)。
SELECT ROUND(1.298, 1); -- 1.3
SELECT ROUND(1.298, 0); -- 1 (等同 ROUND(1.298))
SELECT ROUND(123.456, -1); -- 120 (D 為負數:向左捨入,十位四捨五入)
D 可為負數:表示向左(十位、百位)捨入。D=0 或省略 → BIGINT;D>0 → DECIMAL。所有三函數在無小數位情況下回傳 BIGINT。若後續參與除法運算,會發生整數除法截斷:
SELECT ROUND(5)/2; -- 2 (整數除法)
SELECT ROUND(5)/2.0; -- 2.5 (強制浮點)
SELECT ROUND(5,1)/2; -- 2.5 (ROUND 回傳 DECIMAL)
建議:需保留小數時,明確指定D參數(如ROUND(col, 2)),或乘以1.0強制浮點語境。
MySQL ROUND 採用「四捨五入」(Round half away from zero),非「銀行家捨入」(Round half to even)。若財務系統需銀行家捨入,需自行實作邏輯或應用層處理。
SELECT ROUND(1.015, 2); -- 可能回傳 1.01 而非 1.02(二進位浮點表示誤差)
對策:金額計算務必使用DECIMAL(precision, scale)型別儲存,避免FLOAT/DOUBLE。
SELECT product_id, ROUND(price * 1.05, 2) AS price_with_tax
FROM products;
SELECT order_id, CEILING(total_amount / 100) * 100 AS shipping_fee
FROM orders;
SELECT CEILING(COUNT(*) / 20) AS total_pages FROM logs;
SELECT user_id, FLOOR(balance * 0.9) AS after_discount
FROM accounts;
熟練掌握 ROUND/FLOOR/CEILING 的行為差異、型別回傳與浮點陷阱,是撰寫正確 SQL 數值邏輯的基石。金融、報表、分頁等場景務必依業務語意選擇正確函數並搭配 DECIMAL 型別。