萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

資料庫保留小數位完全指南:ROUND/CEIL/FLOOR/TRUNCATE 四大函式對比

常見需求

金融、報表、計費系統頻繁需要「四捨五入」、「無條件進位」、「無條件捨去」、「直接截斷」四種取整邏輯。主流資料庫均提供對應函式。

四大函式對比表

邏輯Oracle / PostgreSQLMySQLSQL 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) 第三參數=110.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:直接截斷,金融計算避免圓整誤差首選。
  • 負數行為各異,務必實測目標資料庫版本。
copyright © 萬盛學電腦網 all rights reserved