MySQL 中 FLOAT/DOUBLE 為近似數值類型,執行 SUM() 聚合時常出現「一堆不可預期的小數位」問題(如 10.27999973297119140625),源於二進制浮點數無法精確表示十進制小數。本文提供兩種徹底解決方案。
將欄位類型改為 DECIMAL(16,6)(總位數 16,小數位 6),可精確存儲與計算貨幣、測量等對精度敏感的數據。
遷移步驟:
ALTER TABLE t ADD COLUMN tmp_col DECIMAL(16,6);UPDATE t SET tmp_col = CAST(float_col AS DECIMAL(16,6)); 或配合 BINARY 關鍵字確保精確複製利用 BINARY 強制按二進制精確加總:
SELECT SUM(BINARY float_col) FROM t;
此法將浮點數視為二進制字串參與聚合,繞過隱式類型轉換導致的精度損失,適合歷史表結構不可變的場景。
DECIMAL 或整數存分/厘(乘 100/1000 存整數)。BINARY 方案僅治標,長遠仍需推動表結構修正。