数据库double类型的double类型数据,怎么操作存的都是整数

关于MySQL中FLOAT和DOUBLE类型的存储_数据库技术_Linux公社-Linux系统门户网站
你好,游客
关于MySQL中FLOAT和DOUBLE类型的存储
来源:Linux社区&
作者:gaopengtttt
其实在单精度和双精度浮点类型存储中其存储方式和C/C++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定点小数要广得多,而存储空间节省,但是受到精度的影响,所以在严格的数据中尽量使用定点小数mysql decimal(m,d)类型,压根没有浮点数字类型而是number(p,s)定点小数,
float 4字节& & 1& & &
8& & & 23&
指数位 尾数
double 8字节& & 1& & &
52& & 符号位& 指数位& 尾数&那么很明显他们的精度取决于尾数。&而表示的范围取决于指数。
float表示范围:2^8=(-128&127)-2^128&2^127 约为-3.4E38&3.4E38&double表示范围:2^11=(-)-2^3约为-1.7E308&1.7E308可以看到这个范围实际上很广,但是精度确很小float精度:float 尾数23位,2^23=8.3E6& 6-7位double尾数52位,2^52=4.5E15 14-15位
&那么如果使用浮点数据保存了精度大于其范围的数据其会使用四舍五入的方法截断。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(,,'gaopeng');&Query OK, 1 row affected (0.00 sec)&mysql&&Query OK, 0 rows affected (0.00 sec)&mysql& select *&+---------+-------------+---------+&| id1& &
| id2& & & &
| name& & |&+---------+-------------+---------+&| 1234570 |
| gaopeng |&+---------+-------------+---------+&1 row in set (0.00 sec)虽然进行了四舍五入,但是不会有任何报错和警告,这是其标准决定的而不是数据库本生。&可以看到在FLOAT下被四舍五入为1234570,而DOUBLE类型没有问题,那么我们&直接从数据文件中提取数据。&我还是使用了自己写的小工具BCVIEW&[root@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:!& & & & & & & & & & & & & & & & & & & & & & & & &Used gcc version 4.1.2
( 4.1.2-46)& & & & & & & & &******************************************************************&----Current file size is :0.093750 Mb&----Current use set blockszie is 16 Kb&current block:--Offset:00127--cnt bytes:40--data is:00ffffffff0000ffffffff0000ffffff&current block:--Offset:00127--cnt bytes:40--data is:&current block:--Offset:00127--cnt bytes:40--data is:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&current block:--Offset:00127--cnt bytes:40--data is:d79ab039bc1f87df&current block:--Offset:00127--cnt bytes:40--data is:&current block:--Offset:00127--cnt bytes:40--data is:
实际的数据是d09& & & &
rowid& & & &
事物ID& & & & & &0& & & &
回滚指针& & & & & 39b49649& & & & & &
1234570& & &
&91ed7c1f87d63241& &
'gaopeng'& &
关于如何得到数据的可以参考我的博文我们来分析下float的组成,因为LINUX属于小端,存储会是反向的39b49649实际是
&49 &96 &b4 &39
指数位& & & & & &
这里需要减去127&147-127=20为指数
&尾数 需要加入一个1.如下1.如此我们需要将1.乘以2的20次方实际就是右移动20位&为1整数部分34567这里就是最后的数据1234567而显示的时候1234567又被四舍五入为1234570
再来看double
&91ed7c1f87d63241实际为ced91
&0& & & & & & & & & & & & & 符号位& 1043 然后 级指数位 0001为1.0001&010001
整数部分为34567 关于小数部分的计算:0*2^(0-1) 第一位0*2^(0-2) 第二位0*2^(0-3) 第三位1*2^(0-4)=1/16 第四位1*2^(0-5)=1/32 第五位1*2^(0-6)=1/64 第六位.....及0.123=0.1100其额外的部分为无效数字
实际上数据是没有问题的。
本文永久更新链接地址:
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款2009年8月 VC/MFC大版内专家分月排行榜第一
2010年7月 VC/MFC大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 数据库中的double类型 的文章

 

随机推荐