首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 浮點數與定點數陷阱:為何 131072.32 變成 131072.31?

     編輯:MySQL 資料庫相關知識

血淚案例:浮點數精度丟失實測

CREATE TABLE test (c1 FLOAT(10,2), c2 DECIMAL(10,2));
INSERT INTO test VALUES (131072.32, 131072.32);
SELECT * FROM test;
-- 結果:
-- c1         | c2
-- 131072.31  | 131072.32

FLOAT 欄位將 131072.32 存成 131072.31,這正是浮點數「近似值」特性導致的精度誤差。

核心差異速查

類型代表優點缺點適用場景
浮點數FLOAT、DOUBLE (REAL)定長下表示範圍極大精度不準、有誤差科學計算、近似值統計
定點數DECIMAL (NUMERIC)精確儲存、無誤差範圍較小、佔用空間稍大金額、價格、庫存等精度敏感數據

四大避坑鐵律

  1. 浮點數必有誤差:切勿假設 FLOAT 精確。
  2. 金額類數據務必用定點數:DECIMAL(10,2) 等精確類型。
  3. 程式碼中避免直接比較浮點數:改用 ABS(a-b) < epsilon 容差判斷。
  4. 留意特殊值處理:NaN、Infinity、-Infinity 在排序、匯總時行為異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved