首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 浮點數比較陷阱:DOUBLE/FLOAT 不精確問題與 DECIMAL 解決方案

     編輯:MySQL 資料庫相關知識

核心問題

浮點數 (FLOAT/DOUBLE) 在計算機中無法精確儲存,螢幕顯示值往往非真實儲存值。DECIMAL 以字串形式儲存,可保持精確精度。

實測案例

CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);
INSERT INTO t1 VALUES
(1, 101.40, 21.40), (1, -80.00, 0.00),
(2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
(2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
(4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
(5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
(6, 0.00, 0.00), (6, -51.40, 0.00);

SELECT i, SUM(d1) AS a, SUM(d2) AS b
FROM t1 GROUP BY i HAVING a <> b;

結果分析

+------+-------+------+
| i    | a     | b    |
+------+-------+------+
| 1    | 21.4  | 21.4 |
| 2    | 76.8  | 76.8 |
| 3    | 7.4   | 7.4  |
| 4    | 15.4  | 15.4 |
| 5    | 7.2   | 7.2  |
| 6    | -51.4 | 0    |
+------+-------+------+

前 5 組 a=b 但因浮點誤差在極小數位不同,HAVING a <> b 仍判定為不等而被選出。若改用 DECIMAL,結果僅剩第 6 組真正不等的資料。

最佳實務

  • **金融/會計/精確計算務必使用 DECIMAL**
  • 僅需近似值的科學計算可用 DOUBLE/FLOAT
  • 比較浮點數時勿用 =/<>,改用範圍判斷:ABS(a-b) < 0.0001
  • MySQL 以 64 位十進制精度執行 DECIMAL 運算,解決大多數不精確問題
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved