mysql float和double类型的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql float和double类型的区别相关的知识,希望对你有一定的参考价值。

一、数据类型

mysql支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

MySQL支持的整数类型有TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在MySQL中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

类型大小范围(有符号)范围(无符号)unsigned约束用途TINYINT1 字节(-128,127)(0,255)小整数值SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值BIGINT8 字节(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值FLOAT4 字节

float(255,30)(-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)单精度

浮点数值DOUBLE8 字节

double(255,30)(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-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

double(65,30)依赖于M和D的值依赖于M和D的值小数值1.1 int整数示例

# 创建表一个是默认宽度的int,一个是指定宽度的int(5)

mysql> create table t1 (id1 int,id2 int(5));

Query OK, 0 rows affected (0.02 sec)

# 像t1中插入数据1,1

mysql> insert into t1 values (1,1);

Query OK, 1 row affected (0.01 sec)

# 可以看出结果上并没有异常

mysql> select * from t1;

+------+------+

| id1 | id2 |

+------+------+

| 1 | 1 |

+------+------+

row in set (0.00 sec)

# 那么当我们插入了比宽度更大的值,会不会发生报错呢?

mysql> insert into t1 values (111111,111111);

Query OK, 1 row affected (0.00 sec)

# 答案是否定的,id2仍然显示了正确的数值,没有受到宽度限制的影响

mysql> select * from t1;

+------------+--------+

| id1 | id2 |

+------------+--------+

| 0000000001 | 00001 |

| 0000111111 | 111111 |

+------------+--------+

rows in set (0.00 sec)
参考技术A   double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
  类型 比特数 有效数字 数值范围
  float 32 6-7 -3.4*10(-38)~3.4*10(38)
  double 64 15-16 -1.7*10(-308)~1.7*10(308)
  long double 128 18-19 -1.2*10(-4932)~1.2*10(4932)
  简单来说,Float为单精度,内存中占4个字节,有效数位是7位(因为有正负,所以不是8位),在我的电脑且VC++6.0平台中默认显示是6位有效数字;double为双精度,占8个字节,有效数位是16位,但在我的电脑且VC++6.0平台中默认显示同样是6位有效数字。本回答被提问者采纳

MySQL类型float double decimal的区别

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,

float和double都是浮点型,而decimal是定点型;


MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,

M表示该值的总共长度,D表示小数点后面的长度,

M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,

MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。


☆FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。


测试1:

CREATE TABLE test1 (
f FLOAT(5,2) DEFAULT NULL,
d DOUBLE(5,2) DEFAULT NULL,
de DECIMAL(5,2) DEFAULT NULL
);
INSERT INTO test1(f,d,de) VALUES(1.23,1.23,1.23);

数据插入正确:技术分享

2.

INSERT INTO test1(f,d,de) VALUES(1.234,1.234,1.23);

数据插入都正确,但是f和d由于标度的限制,舍去了最后一位。

技术分享

3.

INSERT INTO test1(f,d,de) VALUES(1.234,1.234,1.234);

插入成功,但是有警告

技术分享

技术分享

4.把f,d,de的精度和标度去掉。

INSERT INTO test1(f,d,de) VALUES(1.234,1.234,1.234);

插入正确【f和d的数据正确插入,而de被截断】,同时也会有3一样的提示!

浮点数如果不写精度和标度,则会按照实际显示,如果有精度和标度,则会将数据四舍五入后插入,系统不报错,定点数如果不设置精度和标度,刚按照默认的(10,0)进行操作,如果数据超过了精度和标度值,则会警告!

技术分享


5. 数据求SUM()时会出现不同的结果,float和double求SUM都会出现很多小数点,而decimal求SUM得到的是精准数值:

SELECT SUM(f),SUM(d),SUM(de) FROM test1;

技术分享

技术分享

理论上:f,d后面不应该出现很长的一串浮点小数点的。



本文出自 “我的JAVA世界” 博客,请务必保留此出处http://hanchaohan.blog.51cto.com/2996417/1943564

以上是关于mysql float和double类型的区别的主要内容,如果未能解决你的问题,请参考以下文章

mysql float和double类型的区别

mysql float和double类型的区别

mysql8 数据类型 float double decimal 的区别

MySQL中的float和decimal类型有啥区别

mysql 数据库float,int,bigint,double区别

mysql数据类型double和decimal区别详解