數值精度處理是金融、統計、報表系統的高頻需求。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
ROUND() 採用「四捨五入,五到偶數」(Banker's Rounding)。ROUND(1.5)=2、ROUND(2.5)=2、ROUND(3.5)=4。若需傳統「五入」,需自行實現邏輯。TRUNCATE() 絕不進位,負數向零方向截斷(TRUNCATE(-1.9,0)=-1)。d 可為負數:作用於小數點左側(十位、百位...)。DECIMAL 或 DOUBLE,視輸入類型而定。DECIMAL(precision, scale),避免浮點誤差ROUNDTRUNCATE兩函數均為標量函數,單次調用開銷極低(納秒級)。百萬行數據測試差異 < 1%,可忽略不計。選型依業務語義而非效能。