新聞中心
其實在單精度和雙精度浮點類型存儲中其存儲方式和C/C++一致準守IEEE標準他們都是浮點型的,所謂的浮點型,是小數(shù)點的位置可變,其能夠表示的范圍比定點小數(shù)要廣得多,而存儲空間節(jié)省,但是受到精度的影響,所以在嚴格的數(shù)據(jù)中盡量使用定點小數(shù)MySQL decimal(m,d)類型,Oracle壓根沒有浮點數(shù)字類型而是number(p,s)定點小數(shù),

float 4字節(jié)
1 8 23 符號位 指數(shù)位 尾數(shù)
double 8字節(jié)
1 11 52 符號位 指數(shù)位 尾數(shù) 那么很明顯他們的精度取決于尾數(shù)。 而表示的范圍取決于指數(shù)。
float表示范圍:
2^8=(-128—127) -2^128—2^127 約為-3.4E38—3.4E38 double表示范圍: 2^11=(-1024—1023) -2^1024—2^1023 約為-1.7E308—1.7E308 可以看到這個范圍實際上很廣,但是精度確很小 float精度: float 尾數(shù)23位,2^23=8.3E6 6-7位 double尾數(shù)52位,2^52=4.5E15 14-15位
那么如果使用浮點數(shù)據(jù)保存了精度大于其范圍的數(shù)據(jù)其會使用四舍五入的方法截斷。 MYSQL如下:
mysql> create table dname(id1 float,id2 double,name varchar(20));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dname values(1234567.123,1234567.123,'gaopeng');
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dname;
+---------+-------------+---------+
| id1 | id2 | name |
+---------+-------------+---------+
| 1234570 | 1234567.123 | gaopeng |
+---------+-------------+---------+
1 row in set (0.00 sec)
雖然進行了四舍五入,但是不會有任何報錯和警告,這是其標準決定的而不是數(shù)據(jù)庫本生。 可以看到1234567.123在FLOAT下被四舍五入為1234570,而DOUBLE類型沒有問題,那么我們 直接從數(shù)據(jù)文件中提取數(shù)據(jù)。 我還是使用了自己寫的小工具BCVIEW
[root@[Hadoop](https://www.linuxidc.com/topicnews.aspx?tid=13)1 test]# bcview dname.ibd 16 127 40
******************************************************************
This Tool Is Uesed For Find The Data In Binary format(Hexadecimal)
Usage:./bcview file blocksize offset cnt-bytes!
file: Is Your File Will To Find Data!
blocksize: Is N kb Block.Eg: 8 Is 8 Kb Blocksize(Oracle)!
Eg: 16 Is 16 Kb Blocksize(Innodb)!
offset:Is Every Block Offset Your Want Start!
cnt-bytes:Is After Offset,How Bytes Your Want Gets!
Edtor QQ:22389860!
Used gcc version 4.1.2 20080704 ([Red Hat](https://www.linuxidc.com/topicnews.aspx?tid=10) 4.1.2-46)
******************************************************************
----Current file size is :0.093750 Mb
----Current use set blockszie is 16 Kb
current block:00000000--Offset:00127--cnt bytes:40--data is:00ffffffff0000000000010000000200260000000200260000000000000000ffffffff0000ffffff
current block:00000001--Offset:00127--cnt bytes:40--data is:00000000000000000000000000000000000000000000000000000000000000000000000000000000
current block:00000002--Offset:00127--cnt bytes:40--data is:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
current block:00000003--Offset:00127--cnt bytes:40--data is:000001cc6d090000002d5679ab00000d0c011039b4964991ed7c1f87d6324167616f70656e670000
current block:00000004--Offset:00127--cnt bytes:40--data is:00000000000000000000000000000000000000000000000000000000000000000000000000000000
current block:00000005--Offset:00127--cnt bytes:40--data is:00000000000000000000000000000000000000000000000000000000000000000000000000000000
實際的數(shù)據(jù)是 000001cc6d09 rowid 0000002d5679ab 事物ID 00000d0c0110 回滾指針 39b49649 1234570 91ed7c1f87d63241 1234567.123 67616f70656e67 ‘gaopeng’ 關于如何得到數(shù)據(jù)的可以參考我的博文 http://blog.itpub.net/7728585/viewspace-2071787/ 我們來分析下float的組成,因為LINUX屬于小端,存儲會是反向的 39b49649實際是4996b439
49 01001001 96 10010110 b4 10110100 39 00111001
0 10010011 00101101011010000111001 符號位 指數(shù)位 尾數(shù)
10010011=147 這里需要減去127 147-127=20為指數(shù)
尾數(shù) 00101101011010000111001需要加入一個1. 如下1.00101101011010000111001 如此我們需要將1.00101101011010000111001 乘以2的20次方實際就是右移動20位 為 100101101011010000111.001 整數(shù)部分 100101101011010000111=1234567這里就是最后的數(shù)據(jù)1234567 而顯示的時候1234567又被四舍五入為1234570
再來看double
91ed7c1f87d63241 實際為 4132d6871f7ced91
0 符號位 10000010011 1043 然后1043-1023=20 級指數(shù)位 0010110101101000011100011111011111001110110110010001 為 1.0010110101101000011100011111011111001110110110010001 100101101011010000111.00011111011111001110110110010001
整數(shù)部分為100101101011010000111=1234567 關于小數(shù)部分的計算: 02^(0-1) 第一位 02^(0-2) 第二位 02^(0-3) 第三位 12^(0-4)=1/16 第四位 12^(0-5)=1/32 第五位 12^(0-6)=1/64 第六位 ….. 及0.123=0.0001111101111100其額外的部分為無效數(shù)字
實際上數(shù)據(jù)是沒有問題的。
新聞標題:講解一下MySQL中FLOAT和DOUBLE類型
新聞來源:http://m.fisionsoft.com.cn/article/dpdhesh.html


咨詢
建站咨詢
