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

解決 MySQL FLOAT 類型 SUM() 精度異常:兩大實戰方案

     編輯:MySQL 綜合教學

MySQL 中 FLOAT/DOUBLE 為近似數值類型,執行 SUM() 聚合時常出現「一堆不可預期的小數位」問題(如 10.27999973297119140625),源於二進制浮點數無法精確表示十進制小數。本文提供兩種徹底解決方案。

方案一:改用 DECIMAL 精確數值類型(推薦)

將欄位類型改為 DECIMAL(16,6)(總位數 16,小數位 6),可精確存儲與計算貨幣、測量等對精度敏感的數據。

遷移步驟:

  1. 新增臨時欄位:ALTER TABLE t ADD COLUMN tmp_col DECIMAL(16,6);
  2. 精確遷移數據:UPDATE t SET tmp_col = CAST(float_col AS DECIMAL(16,6)); 或配合 BINARY 關鍵字確保精確複製
  3. 驗證無誤後刪除舊欄位、重命名新欄位

方案二:查詢層面臨時修正(不改表結構)

利用 BINARY 強制按二進制精確加總:

SELECT SUM(BINARY float_col) FROM t;

此法將浮點數視為二進制字串參與聚合,繞過隱式類型轉換導致的精度損失,適合歷史表結構不可變的場景。

核心建議

  • 新建表嚴禁使用 FLOAT/DOUBLE 存儲金額、精確測量值,首選 DECIMAL 或整數存分/厘(乘 100/1000 存整數)。
  • 既有 FLOAT 欄位若涉及聚合計算,務必在應用層或視圖層統一處理精度,避免業務邏輯錯誤。
  • BINARY 方案僅治標,長遠仍需推動表結構修正。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved