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

MySQL ROUND 與 TRUNCATE 差異詳解:四捨五入 vs 直接截斷

     編輯:MySQL 綜合教學

MySQL ROUND 與 TRUNCATE 差異詳解

數值精度處理是金融、統計、報表系統的高頻需求。MySQL 提供 ROUND()(四捨五入)與 TRUNCATE()(截斷)兩個函數,行為差異直接影響計算結果準確性。

核心差異

函數行為語法典型場景
ROUND(x, d)四捨五入到小數點後 d 位ROUND(值, 保留位數)貨幣顯示、統計報表、一般計算
TRUNCATE(x, d)直接截斷到小數點後 d 位(不進位)TRUNCATE(值, 保留位數)利率計算、分頁偏移、嚴格截斷需求

直觀對比範例

SELECT 
  ROUND(1.23456, 4) AS round_4,   -- 1.2346
  TRUNCATE(1.23456, 4) AS trunc_4; -- 1.2345

SELECT 
  ROUND(1.23454, 4) AS round_4,   -- 1.2345
  TRUNCATE(1.23454, 4) AS trunc_4; -- 1.2345

-- 負數行為
SELECT ROUND(-1.5, 0), TRUNCATE(-1.5, 0);  -- -2, -1

-- d 為負數:向左截斷/四捨五入
SELECT ROUND(12345, -2), TRUNCATE(12345, -2); -- 12300, 12300

關鍵行為細節

  1. 銀行家捨入:MySQL ROUND() 採用「四捨五入,五到偶數」(Banker's Rounding)。ROUND(1.5)=2、ROUND(2.5)=2、ROUND(3.5)=4。若需傳統「五入」,需自行實現邏輯。
  2. TRUNCATE() 絕不進位,負數向零方向截斷(TRUNCATE(-1.9,0)=-1)。
  3. d 可為負數:作用於小數點左側(十位、百位...)。
  4. 返回類型:DECIMAL 或 DOUBLE,視輸入類型而定。

金融級精度建議

  • 金額欄位統一用 DECIMAL(precision, scale),避免浮點誤差
  • 匯率、利率計算中間過程保留更高精度,最終輸出才 ROUND
  • 審計要求「截斷而非四捨五入」時,嚴格使用 TRUNCATE
  • 測試邊界值:0.5、-0.5、最大精度、負數、NULL 輸入

效能對比

兩函數均為標量函數,單次調用開銷極低(納秒級)。百萬行數據測試差異 < 1%,可忽略不計。選型依業務語義而非效能。

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