讲解一下MySQL中FLOAT和DOUBLE类型

其实在单精度和双精度浮点类型存储中其存储方式和C/C++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定点小数要广得多,而存储空间节省,但是受到精度的影响,所以在严格的数据中尽量使用定点小数MySQL decimal(m,d)类型,Oracle压根没有浮点数字类型而是number(p,s)定点小数,

float 4字节

1 8 23 符号位 指数位 尾数

double 8字节

1 11 52 符号位 指数位 尾数 那么很明显他们的精度取决于尾数。 而表示的范围取决于指数。

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 尾数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(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)

虽然进行了四舍五入,但是不会有任何报错和警告,这是其标准决定的而不是数据库本生。 可以看到1234567.123在FLOAT下被四舍五入为1234570,而DOUBLE类型没有问题,那么我们 直接从数据文件中提取数据。 我还是使用了自己写的小工具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

实际的数据是 000001cc6d09 rowid 0000002d5679ab 事物ID 00000d0c0110 回滚指针 39b49649 1234570 91ed7c1f87d63241 1234567.123 67616f70656e67 ‘gaopeng’ 关于如何得到数据的可以参考我的博文 http://blog.itpub.net/7728585/viewspace-2071787/ 我们来分析下float的组成,因为LINUX属于小端,存储会是反向的 39b49649实际是4996b439

49 01001001 96 10010110 b4 10110100 39 00111001

0 10010011 00101101011010000111001 符号位 指数位 尾数

10010011=147 这里需要减去127 147-127=20为指数

尾数 00101101011010000111001需要加入一个1. 如下1.00101101011010000111001 如此我们需要将1.00101101011010000111001 乘以2的20次方实际就是右移动20位 为 100101101011010000111.001 整数部分 100101101011010000111=1234567这里就是最后的数据1234567 而显示的时候1234567又被四舍五入为1234570

再来看double

91ed7c1f87d63241 实际为 4132d6871f7ced91

0 符号位 10000010011 1043 然后1043-1023=20 级指数位 0010110101101000011100011111011111001110110110010001 为 1.0010110101101000011100011111011111001110110110010001 100101101011010000111.00011111011111001110110110010001

整数部分为100101101011010000111=1234567 关于小数部分的计算: 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其额外的部分为无效数字

实际上数据是没有问题的。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/214913.html<

(0)
运维的头像运维
上一篇2025-04-12 00:28
下一篇 2025-04-12 00:30

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注