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

MySQL浮點型與定點型精度陷阱全解析:FLOAT/DOUBLE/DECIMAL行為差異實測

     編輯:MySQL 綜合教學

MySQL數值類型精度與標度深度實測

語法定義

類型(M, D):M=精度(總位數),D=標度(小數位數)

  • FLOAT(7,4) 範圍:-999.9999 ~ 999.9999
  • 插入999.00009 → 四捨五入存為999.0001

默認行為差異

類型不指定(M,D)時超出範圍行為
FLOAT按實際精度存儲截斷不報錯
DOUBLE按實際精度存儲截斷不報錯
DECIMAL默認(10,0)即整數報錯Data truncated

實測驗證過程

CREATE TABLE t2(
  id1 FLOAT(5,2),
  id2 DOUBLE(5,2),
  id3 DECIMAL(5,2)
);

-- 測試1: 插入1.23  → 三者均正常
-- 測試2: 插入1.234 → FLOAT/DOUBLE截斷為1.23,DECIMAL截斷為1.23
-- 測試3: 去除精度限制後插入1.234
ALTER TABLE t2 MODIFY id1 FLOAT, MODIFY id2 DOUBLE, MODIFY id3 DECIMAL;
-- 結果: FLOAT/DOUBLE存1.234,DECIMAL變為(10,0)存1並報警告

關鍵發現總結

  1. FLOAT/DOUBLE:不指定精度時「所見即所得」,指定精度時「四捨五入截斷不報錯」
  2. DECIMAL:不指定精度默認(10,0),超出範圍報警告並截斷
  3. 金融/精確計算場景:強制使用DECIMAL(M,D)並顯式指定精度
  4. 科學計算/近似值:可用DOUBLE,避免FLOAT精度不足

最佳實踐建議

-- 價格/金額:精確到分,預留擴展
price DECIMAL(12,2)   -- 支持9999999999.99

-- 比率/百分比:精確到小數點後4-6位
rate DECIMAL(5,4)     -- 0.0000 ~ 9.9999

-- 經緯度:DOUBLE足夠,或DECIMAL(10,7)
lat DOUBLE
lng DOUBLE

-- 避免陷阱:永遠顯式指定DECIMAL精度
-- 錯誤: DECIMAL
-- 正確: DECIMAL(10,2)

驗證腳本模板

INSERT INTO t2 VALUES(1.2345, 1.2345, 1.2345);
SHOW WARNINGS;  -- 必須檢查Warnings捕獲截斷
SELECT * FROM t2;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved