视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
总结MySQL中float、double、decimal三个浮点类型的区别
2020-11-27 16:50:53 责编:小采
文档


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: 0

mysql> 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 1
mysql> 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: 0

mysql> alter table temp2 modify id2 decimal(10,5);
Query OK, 2 rows affected (0.15 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> 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视频教程

下载本文
显示全文
专题