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

MySQL FLOAT/DOUBLE 類型精度陷阱實測與最佳實踐

     編輯:MySQL 綜合教學

浮點數類型看似簡單,實則暗藏精度陷阱。實測 FLOAT(M,D)/DOUBLE(M,D) 插入、查詢、四捨五入行為,總結避坑指南。

FLOAT 實測

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

DOUBLE 實測


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。
  • 小數位超 D 位,四捨五入 存儲。
  • 小數位不足 D 位,補 0 存儲。
  • 浮點數為近似值,0.12 存儲可能為 0.1200000047,絕不可用 = 精確比較。

最佳實踐

查詢比較安全寫法

-- 避免直接 =
WHERE ABS(num - 2.8) < 0.0001

-- 或轉定點數比較
WHERE CAST(num AS DECIMAL(10,3)) = 2.800
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦類型理由
金額、價格、精確計算DECIMAL(M,D)精確定點數,無精度損失
科學計算、坐標、近似值可接受DOUBLE15-17 位有效數字,精度遠超 FLOAT
節省空間、精度要求低FLOAT4 字節,7 位有效數字