千家信息网

MySQL中float、double、decimal三个浮点类型有什么区别

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章给大家分享的是有关MySQL中float、double、decimal三个浮点类型有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。下表中规划了每个浮点类型的
千家信息网最后更新 2025年11月07日MySQL中float、double、decimal三个浮点类型有什么区别

这篇文章给大家分享的是有关MySQL中float、double、decimal三个浮点类型有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

下表中规划了每个浮点类型的存储大小和范围:

类型大小范围(有符号)范围(无符号)用途
==float==4 bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
==double==8 bytes(-1.797 693 134 862 315 7 E+308,-2.225073858507 2014E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
decimal对decimal(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

那么MySQL中这三种都是浮点类型 它们彼此的区别又是什么呢 ??

  1. float 浮点类型用于表示==单精度浮点==数值,
  2. double浮点类型用于表示==双精度浮点==数值

这里肯定有些小伙伴要问了 什么是单精度 什么是双精度 ? 下面我们就来简单了解一下吧!

我们知道一个bytes(字节) 占8位 对吧!

float单精度 存储浮点类型的话 就是 ==4x8=32位的长度== , 所以float单精度浮点数在内存中占 4 个字节,并且用 32 位二进制进行描述

那么 double双精度 存储浮点类型就是 ==8x8 =64位的长度==, 所以double双精度浮点数在内存中占 8 个字节,并且用 64 位二进制进行描述 通过计算、那么64位就可以获得更多的尾数!

尾数 : ==就是小数点后的有多少个数位==

所以这里的精度主要取决于==尾数==部分的位数, 所以根据IEEE二进制浮点数算术标准 来计算得出结论:

float单精度小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位

double双精度小数部分能精确到小数点后的15位,加上小数点前的一位 有效位数为16位。

最后就区别出了小数点后边位数的长度,越长越精确!

double 和 float 彼此的区别:

  1. 在内存中占有的字节数不同, 单精度内存占4个字节, 双精度内存占8个字节
  2. 有效数字位数不同(尾数) 单精度小数点后有效位数7位, 双精度小数点后有效位数16位
  3. 数值取值范围不同 根据IEEE标准来计算!
  4. 在程序中处理速度不同,一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快

double 和 float 彼此的优缺点:

float单精度

优点: float单精度在一些处理器上比double双精度更快而且只占用double双精度一半的空间

缺点: 但是当值很大或很小的时候,它将变得不精确。

double双精度

优点: double 跟 float比较, 必然是 double 精度高,尾数可以有 16 位,而 float 尾数精度只有 7 位

缺点: double 双精度是消耗内存的,并且是 float 单精度的两倍! ,double 的运算速度比 float 慢得多, 因为double 尾数比float 的尾数多, 所以计算起来必然是有开销的!

如何选择double 和 float 的使用场景!

首先: 能用单精度时不要用双精度 以省内存,加快运算速度!

float: 当然你需要小数部分并且对精度的要求不高时,选择float单精度浮点型比较好!

double: 因为小数位精度高的缘故,所以双精度用来进行高速数学计算、科学计算、卫星定位计算等处理器上双精度型实际上比单精度的快, 所以: 当你需要保持多次反复迭代的计算精确性时,或在操作值很大的数字时,双精度型是最好的选择。

说这么多其实就是小数点后面的保留位数多少的问题!

==小结double和float:==

float 表示的小数点位数少,double能表示的小数点位数多,更加精确! 就这么简单 看情况自己选择吧!

double和float 后面的长度m,d代表的是什么?

double(m,d) 和float(m,d) 这里的m,d代表的是什么呢 ? 很多小伙伴也是不清不楚的! 我还是来继续解释一下吧

其实跟前面整数int(n)一样,这些类型也带有附加参数:一个显示宽度m和一个小数点后面带的个数d

比如: 语句 float(7,3) 规定显示的值不会超过 7 位数字,小数点后面带有 3 位数字 、double也是同理

在MySQL中,在定义表字段的时候, unsigned和 zerofill 修饰符也可以被 float、double和 decimal数据类型使用, 并且效果与 int数据类型相同 跟上面一样这里就不多说了!

==小结:==

在MySQL 语句中, 实际定义表字段的时候,

float(M,D) unsigned 中的M代表可以使用的数字位数,D则代表小数点后的小数位数, unsigned 代表不允许使用负数!

double(M,D) unsigned 中的M代表可以使用的数字位数,D则代表小数点后的小数位数

==注意:== M>=D!

decimal类型

==1.介绍decimal==

在存储同样范围的值时,通常比decimal使用更少的空间,float使用4个字节存储,double使用8个字节 ,

而 decimal依赖于M和D的值,所以decimal使用更少的空间

在实际的企业级开发中,经常遇到需要存储金额(3888.00元)的字段,这时候就需要用到数据类型decimal。 在MySQL数据库中,decimal的使用语法是:decimal(M,D),其中, M 的范围是165, D 的范围是030, 而且D不能大于M。

==2.最大值==

数据类型为decimal的字段,可以存储的最大值/范围是多少? 例如:decimal(5,2),则该字段可以存储-999.99~999.99,最大值为999.99。 也就是说D表示的是小数部分长度,(M-D)表示的是整数部分长度。

==3.存储== [了解] decimal类型的数据存储形式是,将每9位十进制数存储为4个字节

(官方解释:Values for DECIMAL columns are stored using a binary format that packs nine decimal digits into 4 bytes)。

那有可能设置的位数不是9的倍数,官方还给了如下表格对照:

Leftover DigitsNumber of Bytes
00
1-21
3-42
5-63
7-94

==表格什么意思呢,举个例子:==

1、字段decimal(18,9),18-9=9,这样整数部分和小数部分都是9,那两边分别占用4个字节; 2、字段decimal(20,6),20-6=14,其中小数部分为6,就对应上表中的3个字节,而整数部分为14,14-9=5,就是4个字节再加上表中的3个字节

所以通常我们在设置小数的时候,都是用的decimal类型!!


小案例1
mysql> drop table temp2;Query OK, 0 rows affected (0.15 sec)mysql> create table temp2(id float(10,2),id2 double(10,2),id3 decimal(10,2));Query OK, 0 rows affected (0.18 sec)mysql>  insert into temp2 values(1234567.21, 1234567.21,1234567.21),(9876543.21,     -> 9876543.12, 9876543.12);Query OK, 2 rows affected (0.06 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> select * from temp2;+------------+------------+------------+| id         | id2        | id3        |+------------+------------+------------+| 1234567.25 | 1234567.21 | 1234567.21 || 9876543.00 | 9876543.12 | 9876543.12 |+------------+------------+------------+2 rows in set (0.01 sec)mysql> desc temp2;+-------+---------------+------+-----+---------+-------+| Field | Type          | Null | Key | Default | Extra |+-------+---------------+------+-----+---------+-------+| id    | float(10,2)   | YES  |     | NULL    |       || id2   | double(10,2)  | YES  |     | NULL    |       || id3   | decimal(10,2) | YES  |     | NULL    |       |+-------+---------------+------+-----+---------+-------+3 rows in set (0.01 sec)复制代码
小案例2
mysql> drop table temp2;Query OK, 0 rows affected (0.16 sec)mysql> create table temp2(id double,id2 double);Query OK, 0 rows affected (0.09 sec)mysql> insert into temp2 values(1.235,1,235);ERROR 1136 (21S01): Column count doesn't match value count at row 1mysql> insert into temp2 values(1.235,1.235);Query OK, 1 row affected (0.03 sec)mysql> mysql> select * from temp2;+-------+-------+| id    | id2   |+-------+-------+| 1.235 | 1.235 |+-------+-------+1 row in set (0.00 sec)mysql> insert into temp2 values(3.3,4.4);Query OK, 1 row affected (0.09 sec)mysql> select * from temp2;+-------+-------+| id    | id2   |+-------+-------+| 1.235 | 1.235 ||   3.3 |   4.4 |+-------+-------+2 rows in set (0.00 sec)mysql> select id-id2 from temp2;+---------------------+| id-id2              |+---------------------+|                   0 || -1.1000000000000005 |+---------------------+2 rows in set (0.00 sec)mysql> alter table temp2 modify id decimal(10,5);Query OK, 2 rows affected (0.28 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> alter table temp2 modify id2 decimal(10,5);Query OK, 2 rows affected (0.15 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> select * from temp2;+---------+---------+| id      | id2     |+---------+---------+| 1.23500 | 1.23500 || 3.30000 | 4.40000 |+---------+---------+2 rows in set (0.00 sec)mysql> select id-id2 from temp2;+----------+| id-id2   |+----------+|  0.00000 || -1.10000 |+----------+2 rows in set (0.00 sec)

感谢各位的阅读!关于MySQL中float、double、decimal三个浮点类型有什么区别就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

小数 精度 类型 单精度 位数 小数点 浮点 字节 存储 尾数 范围 部分 代表 内存 字段 数字 精确 数值 数据 长度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库建设人员是干嘛的 神龙服务器ip地址在哪里 软件开发产品维保期是几年 北京gps守时模块服务器 怎么找到mc收藏的服务器 数据库版本转换工具 数据库微课的总结报告 强一致数据库 mc服务器守则 中国书法家会员数据库 纵协网络技术有限公司怎么样 怎么在数据库给字段建个分类 互联网技术开发和软件开发 怎么手机会显示无法联系服务器 数据库被占用 皮皮虾我的世界服务器号 数据库建表报错怎么回事 这表明微软的激活服务器负载过高 松江区质量网络技术服务价目表 互联网科技小贷申请报告 通信网络安全员考试题库 专利免费数据库下载 网络技术总监主要负责人 防双网混插网络安全套件 网络安全 红队 蓝队 厦门智业his用什么数据库 大学生注意网络安全的意义 软件开发进度与质量保证措施 服务器学生管理系统 计算机三级数据库技术全称
0