ROUND() 是數值處理的基石函數:四捨五入到整數、保留指定小數位、甚至按負數位捨入(十位、百位)。但各資料庫對負數、邊界值、返回類型、銀行家捨入 (Banker's Rounding) 處理差異極大,本文系統梳理 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 的 ROUND 行為,並給出避坑指南。
ROUND(number [, decimals])
number:要捨入的數值運算式。decimals:可選,保留小數位數。正數→小數點右側;負數→小數點左側 (十位、百位);0 或省略→整數。SELECT
ROUND(1.23) AS r1, -- 1
ROUND(1.58) AS r2, -- 2
ROUND(-1.23) AS r3, -- -1
ROUND(-1.58) AS r4, -- -2 (遠離零)
ROUND(1.298, 1) AS r5, -- 1.3
ROUND(1.298, 0) AS r6, -- 1
ROUND(123.45, -1) AS r7, -- 120 (十位捨入)
ROUND(123.45, -2) AS r8; -- 100 (百位捨入)
BIGINT,小數參數返回 DECIMAL。ROUND(number, decimals, mode),mode=1 為 Banker's Rounding (到最近偶數)。預設 mode=0 標準四捨五入。SELECT
ROUND(1.23) AS r1, -- 1 (numeric)
ROUND(1.58) AS r2, -- 2
ROUND(-1.58) AS r3, -- -2
ROUND(1.298, 1) AS r4, -- 1.3
ROUND(123.45, -1) AS r5; -- 120
numeric 返回 numeric,保留精度標度;輸入 float 返回 float。ROUND(numeric, int) 多簽名。SELECT
ROUND(123.456, 2) AS r1, -- 123.460 (保留尾隨零)
ROUND(123.456, -1) AS r2, -- 120.0
ROUND(-123.456, 2) AS r3; -- -123.460
function:0 四捨五入 (預設),1 截斷 (TRUNCATE 行為)。ROUND(123.456, 2, 1) → 123.450 (截斷)。SELECT
ROUND(1.23) AS r1, -- 1
ROUND(1.58) AS r2, -- 2
ROUND(-1.58) AS r3, -- -2
ROUND(1.298, 1) AS r4, -- 1.3
ROUND(123.45, -1) AS r5 FROM dual; -- 120
NUMBER,精度標度自動調整。decimals。SELECT
ROUND(1.23) AS r1, -- 1.0
ROUND(1.58) AS r2, -- 2.0
ROUND(1.298, 1) AS r3; -- 1.3
DECIMAL 類型,所有數值為 REAL (IEEE 754 雙精度)。ROUND(1.005, 2) 可能得 1.0 而非 1.01)。| 場景 | MySQL | PostgreSQL | SQL Server | Oracle | SQLite |
|---|---|---|---|---|---|
| 負數四捨五入 | 遠離零 (-1.5→-2) | 遠離零 | 遠離零 | 遠離零 | 遠離零 |
| 返回類型 | 整數→BIGINT, 小數→DECIMAL | 跟隨輸入類型 | 跟隨輸入類型 | NUMBER | REAL (浮點) |
| 負數 decimals | 支援 | 支援 | 支援 | 支援 | 支援 |
| 銀行家捨入 | 8.0.16+ mode=1 | 無內建 | 無內建 | 無內建 | 無 |
| 截斷模式 | 無 (用 TRUNCATE) | 無 (用 TRUNC) | 第3參數=1 | 無 (用 TRUNC) | 無 |
mysql> select ROUND(-1.23); -- -1 mysql> select ROUND(-1.58); -- -2 mysql> select ROUND(1.58); -- 2 mysql> select ROUND(1.298, 1); -- 1.3 mysql> select ROUND(1.298, 0); -- 1
注意: ROUND 返回值被轉換為 BIGINT (整數情況)!
DECIMAL(19,4) 存儲、ROUND(DECIMAL, 2) 計算,避免二進制浮點誤差。0.5, -0.5, 1.5, -1.5, 1.005, -1.005 驗證行為一致。Intl.NumberFormat 處理。SELECT ROUND(SUM(amount), 2) FROM ... 而非逐行 ROUND 再 SUM (精度不同)。ROUND(sales, -3) 百萬級報表。ROUND() 是數值精度的守門員。理解各資料庫的捨入規則、返回類型、邊界行為,並在架構層面統一「存 DECIMAL、算 ROUND、顯交前端」,才能讓財務報表、科學計算、業務指標經得起跨系統驗證與審計。