在 MySQL 中處理數值格式化時,常見需求是將小數點後保留固定位數。本文將介紹三種常用函數 FORMAT()、TRUNCATE() 與 CONVERT() 的行為差異,並說明如何根據業務需求選擇最適合的方案。
FORMAT(X, D) 會將數字 X 格式化為 '#,###,###.##' 形式,保留 D 位小數並四捨五入,回傳型別為字串。整數部分超過三位時會自動以逗號分隔。
SELECT FORMAT(12562.6655, 2);
結果: 12,562.67
官方文件說明:
Formats the number X to a format like '#,###,###.##', rounded to D decimal places, and returns the result as a string. If D is 0, the result has no decimal point or fractional part.
更多範例:
mysql> SELECT FORMAT(12332.123456, 4); -- '12,332.1235'
mysql> SELECT FORMAT(12332.1, 4); -- '12,332.1000'
mysql> SELECT FORMAT(12332.2, 0); -- '12,332'
缺點: 回傳字串且包含千分位逗號,不適合直接用於數值運算或需無逗號格式的場景。
TRUNCATE(X, D) 會直接捨去小數點後第 D+1 位及之後的數字,不進行四捨五入。
SELECT TRUNCATE(4545.1366, 2);
結果: 4545.13
缺點: 非四捨五入邏輯,可能不符合財務或統計需求。
將數值轉型為 DECIMAL(精度, 小數位) 可達到標準四捨五入且無逗號的純數值結果。
SELECT CONVERT(4545.1366, DECIMAL(10,2));
結果: 4545.14
也可使用 CAST(4545.1366 AS DECIMAL(10,2)),效果相同。
優點: 回傳數值型別、無千分位逗號、標準四捨五入,最符合大多數業務預期。
| 函數 | 四捨五入 | 千分位逗號 | 回傳型別 | 適用場景 |
|---|---|---|---|---|
| FORMAT() | 是 | 有 | 字串 | 報表顯示、需逗號分隔的字串輸出 |
| TRUNCATE() | 否(截斷) | 無 | 數值 | 需直接捨去尾數、不四捨五入的計算 |
| CONVERT()/CAST() | 是 | 無 | 數值 | 一般業務運算、儲存、需標準四捨五入的數值處理 |
CAST(val AS DECIMAL(p,s)) 或 CONVERT(val, DECIMAL(p,s))。FORMAT()。TRUNCATE()。