首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 四捨五入與取整函數完全攻略:ROUND、FLOOR、CEILING 實戰詳解

     編輯:MySQL 資料庫相關知識

MySQL 四捨五入與取整函數完全攻略:ROUND、FLOOR、CEILING 實戰詳解

MySQL 提供三大核心數值取整函數:ROUND(四捨五入)、FLOOR(向下取整)、CEILING(向上取整)。本文系統整理語法、行為差異、負數處理、精度控制與資料型別轉換陷阱,助你精準掌控數值計算。

函數速查表

函數用途語法回傳型別
FLOOR向下取整(不大於 X 的最大整數)FLOOR(X)BIGINT
CEILING向上取整(不小於 X 的最小整數)CEILING(X)BIGINT
ROUND四捨五入(可指定小數位)ROUND(X) / ROUND(X, D)BIGINT / DECIMAL

一、FLOOR:向下取整

SELECT FLOOR(1.23);   -- 1
SELECT FLOOR(-1.23);  -- -2  (注意:負數「向下」是更小的整數)
  • 回傳 BIGINT,若輸入為 NULL 則回傳 NULL。

二、CEILING:向上取整

SELECT CEILING(1.23);   -- 2
SELECT CEILING(-1.23);  -- -1  (負數「向上」是更接近零的整數)
  • 同樣回傳 BIGINT。

三、ROUND:四捨五入(核心重點)

1. 無精度參數:四捨五入至整數

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)。

2. 指定精度 D:保留 D 位小數

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。

四、關鍵陷阱與最佳實踐

⚠️ 陷阱 1:回傳型別隱性轉換

所有三函數在無小數位情況下回傳 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 強制浮點語境。

⚠️ 陷阱 2:銀行家捨入 vs 四捨五入

MySQL ROUND 採用「四捨五入」(Round half away from zero),非「銀行家捨入」(Round half to even)。若財務系統需銀行家捨入,需自行實作邏輯或應用層處理。

⚠️ 陷阱 3:浮點數精度誤差

SELECT ROUND(1.015, 2);  -- 可能回傳 1.01 而非 1.02(二進位浮點表示誤差)
對策:金額計算務必使用 DECIMAL(precision, scale) 型別儲存,避免 FLOAT/DOUBLE。

五、實戰應用範例

1. 價格四捨五入至分(兩位小數)

SELECT product_id, ROUND(price * 1.05, 2) AS price_with_tax
FROM products;

2. 統計報表:金額向上取整(如運費計算)

SELECT order_id, CEILING(total_amount / 100) * 100 AS shipping_fee
FROM orders;

3. 分頁計算:總頁數 = CEILING(總筆數 / 每頁筆數)

SELECT CEILING(COUNT(*) / 20) AS total_pages FROM logs;

4. 負數處理:扣款金額向下取整(有利用戶)

SELECT user_id, FLOOR(balance * 0.9) AS after_discount
FROM accounts;

熟練掌握 ROUND/FLOOR/CEILING 的行為差異、型別回傳與浮點陷阱,是撰寫正確 SQL 數值邏輯的基石。金融、報表、分頁等場景務必依業務語意選擇正確函數並搭配 DECIMAL 型別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved