首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> SQL 基礎

SQL ROUND() 函數完全指南:四捨五入、指定小數位、負數處理與跨資料庫差異

     編輯:SQL 基礎

SQL ROUND() 函數完全指南:四捨五入、指定小數位、負數處理與跨資料庫差異

ROUND() 是數值處理的基石函數:四捨五入到整數、保留指定小數位、甚至按負數位捨入(十位、百位)。但各資料庫對負數、邊界值、返回類型、銀行家捨入 (Banker's Rounding) 處理差異極大,本文系統梳理 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 的 ROUND 行為,並給出避坑指南。

核心語法

ROUND(number [, decimals])
  • number:要捨入的數值運算式。
  • decimals:可選,保留小數位數。正數→小數點右側;負數→小數點左側 (十位、百位);0 或省略→整數。

MySQL:標準四捨五入 (Away from Zero)

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。
  • 銀行家捨入:MySQL 8.0.16+ 引入 ROUND(number, decimals, mode),mode=1 為 Banker's Rounding (到最近偶數)。預設 mode=0 標準四捨五入。

PostgreSQL:標準四捨五入 + 數值類型保留

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) 多簽名。

SQL Server:標準四捨五入,返回類型跟隨輸入

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 (截斷)。

Oracle:標準四捨五入,NUMBER 類型贏

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。

SQLite:標準四捨五入,實數運算

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跟隨輸入類型跟隨輸入類型NUMBERREAL (浮點)
負數 decimals支援支援支援支援支援
銀行家捨入8.0.16+ mode=1無內建無內建無內建無
截斷模式無 (用 TRUNCATE)無 (用 TRUNC)第3參數=1無 (用 TRUNC)無

MySQL 實戰範例

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 (整數情況)!

避坑指南與最佳實踐

  1. 金額計算禁用浮點:DECIMAL(19,4) 存儲、ROUND(DECIMAL, 2) 計算,避免二進制浮點誤差。
  2. 跨資料庫遷移必測邊界值:0.5, -0.5, 1.5, -1.5, 1.005, -1.005 驗證行為一致。
  3. 顯示格式化交給應用層:資料庫只做數學捨入,千分位、貨幣符號、Locale 格式化由前端 Intl.NumberFormat 處理。
  4. 大量聚合捨入:SELECT ROUND(SUM(amount), 2) FROM ... 而非逐行 ROUND 再 SUM (精度不同)。
  5. 負數 decimals 用途:報表萬單位、千單位捨入:ROUND(sales, -3) 百萬級報表。

ROUND() 是數值精度的守門員。理解各資料庫的捨入規則、返回類型、邊界行為,並在架構層面統一「存 DECIMAL、算 ROUND、顯交前端」,才能讓財務報表、科學計算、業務指標經得起跨系統驗證與審計。

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