MySQL:float和double有什么区别?

检查新的数据库结构,我看到有人将一个字段从float更改为double。 想知道为什么,我查了一下mysql文档,但是老实说不明白是什么区别。

有人可以解释吗?

它们都代表浮点数。 FLOAT用于单精度,而DOUBLE用于双精度数字。

MySQL使用四个字节的单精度值和八个字节的双精度值。

与浮点数和十进制(数字)数有很大的不同,您可以使用DECIMAL数据types。 这用于存储精确的数字数据值,与浮点数不同的是,保存精确的精度非常重要,例如使用货币数据。

也许这个例子可以解释。

 CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2)); 

我们有这样一个表格:

 +-------+-------------+ | Field | Type | +-------+-------------+ | fla | float | | flb | float | | dba | double(10,2)| | dbb | double(10,2)| +-------+-------------+ 

对于第一个区别,我们尝试在每个字段中插入一个带有“1.2”的logging:

 INSERT INTO `test` values (1.2,1.2,1.2,1.2); 

表格显示如下:

 SELECT * FROM `test`; +------+------+------+------+ | fla | flb | dba | dbb | +------+------+------+------+ | 1.2 | 1.2 | 1.20 | 1.20 | +------+------+------+------+ 

看到不同?

我们尝试下一个例子:

 SELECT fla+flb, dba+dbb FROM `test`; 

你好! 我们可以find像这样的不同之处:

 +--------------------+---------+ | fla+flb | dba+dbb | +--------------------+---------+ | 2.4000000953674316 | 2.40 | +--------------------+---------+ 

双打就像漂浮物,除了他们是两倍大的事实。 这允许更高的准确度。

FLOAT存储浮点数,精度可达八位,并有四个字节,而DOUBLE存储浮点数,精度高达18位,并有八个字节。

浮点数为32位(4字节),精度为8位。 Double有64位(8字节),精度为16位。

如果您需要更好的准确性,请使用Double而不是Float

以为我会添加我自己的例子,帮助我看到使用值1.3添加或乘以另一个floatdecimaldouble差异。

 |float add | double add | decimal add | float multiply | double multiply | decimal multiply | +-------------------+------------+-------------+--------------------+--------------------+------------------+ |2.5999999046325684 | 2.6 | 2.60000 | 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 | 

这是使用MySQL 6.7

查询:

 SELECT float_1 + float_2 as 'float add', double_1 + double_2 as 'double add', decimal_1 + decimal_2 as 'decimal add', float_1 * float_2 as 'float multiply', double_1 * double_2 as 'double multiply', decimal_1 * decimal_2 as 'decimal multiply' FROM numerics 

创build表格和插入数据:

 CREATE TABLE `numerics` ( `float_1` float DEFAULT NULL, `float_2` float DEFAULT NULL, `double_1` double DEFAULT NULL, `double_2` double DEFAULT NULL, `decimal_1` decimal(10,5) DEFAULT NULL, `decimal_2` decimal(10,5) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `_numerics` (`float_1`, `float_2`, `double_1`, `double_2`, `decimal_1`, `decimal_2`) VALUES (1.3,1.3,1.3,1.3,1.30000,1.30000);