浮點數類型看似簡單,實則暗藏精度陷阱。實測 FLOAT(M,D)/DOUBLE(M,D) 插入、查詢、四捨五入行為,總結避坑指南。
CREATE TABLE tt (num FLOAT(9,3));
INSERT INTO tt VALUES (123456.8); -- OK
INSERT INTO tt VALUES (1234567.8); -- ERROR 1264: Out of range
SELECT * FROM tt;
+-----------+
| num |
+-----------+
| 123456.797| -- 注意:123456.8 變 123456.797(二進制近似)
+-----------+
INSERT INTO tt VALUES (2.888888); -- 存為 2.889(四捨五入到 D 位)
SELECT * FROM tt WHERE num = 2.8; -- 能查到 2.800
CREATE TABLE tt (num DOUBLE(9,3));
INSERT INTO tt VALUES (234563.9); -- OK
INSERT INTO tt VALUES (2345623.2); -- ERROR 1264
SELECT * FROM tt;
+-----------+
| num |
+-----------+
| 234563.900|
| 234563.200|
+-----------+
FLOAT(M,D)/DOUBLE(M,D):M = 總位數(含小數點前後),D = 小數位數。整數部分最多 M-D 位。1264 Out of range。0.12 存儲可能為 0.1200000047,絕不可用 = 精確比較。| 場景 | 推薦類型 | 理由 |
|---|---|---|
| 金額、價格、精確計算 | DECIMAL(M,D) | 精確定點數,無精度損失 |
| 科學計算、坐標、近似值可接受 | DOUBLE | 15-17 位有效數字,精度遠超 FLOAT |
| 節省空間、精度要求低 | FLOAT | 4 字節,7 位有效數字 |