對於單精度浮點數Float: 當數據范圍在±131072(65536×2)以內的時候,float數據精度是正確的,但是超出這個范圍的數據就不穩定,沒有發現有相關的參數設置建議:將float改成double或者decimal,兩者的差別是double是浮點計算,decimal是定點計算,會得到更精確的數據。
下面使用分析,
首先創建測試表
CREATE TABLE `customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `age` int(11) DEFAULT NULL, `jinqian` float(5,2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=11111112 DEFAULT CHARSET=utf8;
float(m,d)
m表示的是最大長度,d表示的顯示的小數位數。
例如上面的sql里:float(5,2) 表示:這個浮點數最大長度為5,也就是五位,然后小數部分為2位,至於存儲范圍,取決於你是否定義了無符號。
無符號的話,最小是0.0 最大能存儲到99999.9,如果有符號的話,范圍是:-99999.9至99999.9。
默認大小為24位數字,精度大約7位數字(經測試為6位),當設置M大小大於24時,自動轉換為DOUBLE類型;同時設置M和D時不進行自動轉換。
小數位超過設定值,按四舍五入保存
INSERT INTO customer (id,name,age,jinqian) VALUES (111111111,'uu',15,90.012); INSERT INTO customer (id,name,age,jinqian) VALUES (1111111111,'uu',15,90.018);
上面兩個分別被保存為
小數位如果都是0,則不保存小數位
INSERT INTO customer (id,name,age,jinqian) VALUES (1,'uu',15,90.0); INSERT INTO customer (id,name,age,jinqian) VALUES (11,'uu',15,90.00);
上面兩個分別被保存為
總結
從上面的分析,我們可以得出以下結論:
1、浮點數存在誤差問題;
2、對貨幣等對精度敏感的數據,應該用定點數表示或存儲;
3、編程中,如果用到浮點數,要特別注意誤差問題,並盡量避免做浮點數比較;
4、要注意浮點數中一些特殊值的處理