在检查新的数据库结构时,我看到有人将一个字段从 float 更改为 double。不知道为什么,我查看了 mysql 文档,但老实说不明白有什么区别。
有人能解释一下吗?
双打就像彩车,只不过它们是彩车的两倍大。这样可以获得更高的准确度。
它们都表示浮点数。 FLOAT表示单精度数,而 DOUBLE表示双精度数。
FLOAT
DOUBLE
MySQL 对单精度值使用4个字节,对双精度值使用8个字节。
这与浮点数和十进制(数值)数有很大的不同,您可以将它们用于 DECIMAL数据类型。这用于存储精确的数值数据值,不像浮点数,在浮点数中,保持精确的精度非常重要,例如货币数据。
DECIMAL
FLOAT 存储的浮点数精度最高可达8位,有4个字节,而 DOUABLE 存储的浮点数精度最高可达18位,有8个字节。
也许这个例子可以解释。
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的记录:
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`;
大家好! 我们可以找到这样的区别:
+--------------------+---------+ | fla+flb | dba+dbb | +--------------------+---------+ | 2.4000000953674316 | 2.40 | +--------------------+---------+
Float 有32位(4字节) ,精度为8位。 Double 有64位(8字节) ,精度为16位。
如果需要更高的精度,可以使用 双倍 漂浮.
我想添加我自己的例子,帮助我看到使用值 1.3与另一个 float、 decimal和 double相加或相乘时的差异。
1.3
float
decimal
double
1.3浮子增加到 1.3的不同类型:
|float | double | decimal | +-------------------+------------+-----+ |2.5999999046325684 | 2.6 | 2.60000 |
1.3浮子乘以不同类型的 1.3:
| float | double | decimal | +--------------------+--------------------+--------------+ | 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
创建表并插入数据:
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 );