CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);
INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00), ...;
SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1 GROUP BY i HAVING a <> b;
-- 返回 6 行,肉眼看 a=b 卻判定不相等
FLOAT (4 位元組、~7 位有效數字)、DOUBLE (8 位元組、~15 位) 均為近似值。DECIMAL(10,2) 精確表示 99999999.99 至 -99999999.99。| 型別 | 同樣資料查詢 HAVING a <> b | 說明 |
|---|---|---|
| DOUBLE | 返回 6 行 (含誤差行) | 累加誤差放大導致判定不等 |
| DECIMAL | 僅返回 1 行 (真正不等行) | 精確運算,無誤差干擾 |
WHERE ABS(float_col - target) < 0.0001WHERE float_col = 1.23 ❌ → WHERE float_col BETWEEN 1.2299 AND 1.2301 ✅price DECIMAL(10,2) NOT NULL、rate DECIMAL(5,4)。BigDecimal (Java)、decimal.Decimal (Python)、decimal (C#),禁止 float/double 處理金額。"123.45",避免解析端浮點化。浮點數比較問題是計算機科學基礎知識缺失導致的經典坑。鐵律:錢用 DECIMAL、科學計算用 DOUBLE+容差、永不直接 == 比較浮點數。資料庫設計評審時,凡涉及金額、比率、庫存計量 必須檢查型別為 DECIMAL。