MySQL: float 和 double 有什么区别?

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

有人能解释一下吗?

182305 次浏览

双打就像彩车,只不过它们是彩车的两倍大。这样可以获得更高的准确度。

它们都表示浮点数。 FLOAT表示单精度数,而 DOUBLE表示双精度数。

MySQL 对单精度值使用4个字节,对双精度值使用8个字节。

这与浮点数和十进制(数值)数有很大的不同,您可以将它们用于 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与另一个 floatdecimaldouble相加或相乘时的差异。

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
);