CREATE TABLE test (c1 FLOAT(10,2), c2 DECIMAL(10,2));
INSERT INTO test VALUES (131072.32, 131072.32);
SELECT * FROM test;
-- c1=131072.31 c2=131072.32 ← 浮點數誤差!
FLOAT:4 字節(32 位),單精度,有效數字 ~7 位DOUBLE:8 字節(64 位),雙精度,有效數字 ~15 位| 類型 | 儲存 | 精度 | 適用場景 |
|---|---|---|---|
| FLOAT | 4 bytes | ~7 位有效數字 | 科學計算、近似值、不需精確 |
| DOUBLE | 8 bytes | ~15 位有效數字 | 高精度科學計算 |
| DECIMAL(M,D) | M+2 bytes | 精確到 D 位小數 | 貨幣、金融、精確計算 |
| NUMERIC | 同 DECIMAL | 同 DECIMAL | 同 DECIMAL |
FLOAT(M,D) -- M 總位數,D 小數位(僅顯示寬度,儲存仍為浮點)
DOUBLE(M,D)
DECIMAL(M,D) -- 標準,精確定點數
// Java
System.out.println(7.22f - 7.0f); // 0.21999979 ≠ 0.22
// Python
print(0.1 + 0.2) // 0.30000000000000004
規則:絕不直接比較浮點數相等,用絕對值差 < epsilon 判斷。
DECIMAL(19,4) 或 BIGINT 存分/厘DOUBLENUMBER(p,s):精確定點數(對應 MySQL DECIMAL)BINARY_FLOAT/DOUBLE:IEEE 754 浮點數(同樣不精確)浮點數天生不精確。凡涉及錢、精確計算,唯一正解是 DECIMAL(或整數存最小單位)。程式碼中禁止 == 比較 float/double。