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
添加或乘以另一个float
, decimal
和double
差异。
|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);