我想很多朋友都不怎么會在mysql中使用float類型,特別是用到金錢時我們可能會用雙精度來做,我們知道m(xù)ysql的float類型是單精度浮點類型不小心就會導致數(shù)據(jù)誤差
單精度浮點數(shù)用4字節(jié)(32bit)表示浮點數(shù),采用IEEE754標準的計算機浮點數(shù),在內(nèi)部是用二進制表示的,如:7.22用32位二進制是表示不下的,所以就不精確了。
mysql中float數(shù)據(jù)類型的問題總結(jié)
對于單精度浮點數(shù)Float:當數(shù)據(jù)范圍在±131072(65536×2)以內(nèi)的時候,float數(shù)據(jù)精度是正確的,但是超出這個范圍的數(shù)據(jù)就不穩(wěn)定,沒有發(fā)現(xiàn)有相關的參數(shù)設置建議:將float改成double或者decimal,兩者的差別是double是浮點計算,decimal是定點計算,會得到更精確的數(shù)據(jù)。
1.float類型
float列類型默認長度查不到結(jié)果,必須指定精度,比如 num float, insert into table (num) values (0.12); select * from table where num=0.12的話,empty set,代碼如下:
- num float(9,7), insert into table (num) values (0.12); select * from table where num=0.12的話會查到這條記錄。
- mysql> create table tt
- -> (
- -> num float(9,3)
- -> );
- Query OK, 0 rows affected (0.03 sec)
- mysql> insert into tt(num)values(1234567.8);
- ERROR 1264 (22003): Out of range value for column 'num' at row 1
注:超出字段范圍,無法插入,代碼如下:
- mysql> insert into tt(num)values(123456.8);
- Query OK, 1 row affected (0.00 sec)
- mysql> select * from tt;
- +------------+
- | num |
- +------------+
- | 123456.797 |
- +------------+
- 1 row in set (0.00 sec)
注:小數(shù)位數(shù)不夠,自動補齊,但是存在一個問題就是如上的近似值,代碼如下:
- mysql> insert into tt(num)values(123456.867);
- Query OK, 1 row affected (0.04 sec)
- mysql> select * from tt;
- +------------+
- | num |
- +------------+
- | 123456.797 |
- | 123456.797 |
- | 123456.867 |
- +------------+
- 3 rows in set (0.00 sec)
- mysql> select * from tt where num=123456.867;
- +------------+
- | num |
- +------------+
- | 123456.867 |
- +------------+
- 1 row in set (0.00 sec)
- mysql> insert into tt(num)values(2.8);
- Query OK, 1 row affected (0.04 sec)
- mysql> select * from tt;
- +------------+
- | num |
- +------------+
- | 123456.797 |
- | 123456.797 |
- | 123456.867 |
- | 2.800 |
- +------------+
- 4 rows in set (0.00 sec)
- mysql> select * from tt where num=2.8;
- +-------+
- | num |
- +-------+
- | 2.800 |
- +-------+
- 1 row in set (0.00 sec)
- mysql> insert into tt(num)values(2.888888);
- Query OK, 1 row affected (0.00 sec)
- --Vevb.com
- mysql> select * from tt;
- +------------+
- | num |
- +------------+
- | 123456.797 |
- | 123456.797 |
- | 123456.867 |
- | 2.800 |
- | 2.889 |
- +------------+
- 5 rows in set (0.00 sec)
注:小數(shù)位數(shù)超了,自動取近似值.
一、浮點數(shù)的概念及誤差問題
浮點數(shù)是用來表示實數(shù)的一種方法,它用 M(尾數(shù)) * B( 基數(shù))的E(指數(shù))次方來表示實數(shù),相對于定點數(shù)來說,在長度一定的情況下,具有表示數(shù)據(jù)范圍大的特點,但同時也存在誤差問題,這就是著名的浮點數(shù)精度問題,浮點數(shù)有多種實現(xiàn)方法,計算機中浮點數(shù)的實現(xiàn)大都遵從 IEEE754 標準,IEEE754 規(guī)定了單精度浮點數(shù)和雙精度浮點數(shù)兩種規(guī)格,單精度浮點數(shù)用4字節(jié)(32bit)表示浮點數(shù),格式是:1位符號位 8位表示指數(shù) 23位表示尾數(shù),雙精度浮點數(shù)8字節(jié)(64bit)表示實數(shù),格式是:1位符號位 11位表示指數(shù) 52位表示尾數(shù).
新聞熱點
疑難解答
圖片精選