MySQL:float和double有什么区别?

MySQL: What's the difference between float and double?

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

有人能解释吗?


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

MySQL使用四个字节作为单精度值,使用八个字节作为双精度值。

与浮点数和十进制(数字)数字有很大的区别,您可以将它们与DECIMAL数据类型一起使用。这用于存储精确的数字数据值,与浮点数不同,在浮点数中,保持精确的精度非常重要,例如货币数据。


也许这个例子可以解释。

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

我们有一张这样的桌子:

1
2
3
4
5
6
7
8
+-------+-------------+
| Field | Type        |
+-------+-------------+
| fla   | float       |
| flb   | float       |
| dba   | double(10,2)|
| dbb   | double(10,2)|
+-------+-------------+

对于第一个差异,我们尝试向每个字段插入一个"1.2"的记录:

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

表格显示如下:

1
2
3
4
5
6
7
SELECT * FROM `test`;

+------+------+------+------+
| fla  | flb  | dba  | dbb  |
+------+------+------+------+
|  1.2 |  1.2 | 1.20 | 1.20 |
+------+------+------+------+

看到不同了吗?

我们尝试下一个例子:

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

霍拉!我们可以发现如下不同:

1
2
3
4
5
+--------------------+---------+
| fla+flb            | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 |    2.40 |
+--------------------+---------+


双打就像浮球,除了两倍大。这样可以获得更高的精度。


浮点有32位(4字节),精度为8位。double具有64位(8字节)和16位精度。

如果你需要更好的准确度,就用双倍来代替漂浮的


float存储浮点数的精度高达8位,有4个字节;double存储浮点数的精度高达18位,有8个字节。


我想我会添加我自己的例子,帮助我在与另一个FLOATDECIMALDOUBLE相加或相乘时,使用值1.3看到差异。

添加到不同类型的1.3中的1.3浮点数:

1
2
3
|float              | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6    | 2.60000 |

1.3浮点数乘以不同类型的1.3

1
2
3
| float              | double             | decimal      |
+--------------------+--------------------+--------------+
| 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 |

这是使用MySQL6.7

查询:

1
2
3
4
5
6
7
8
9
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

创建表并插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
    );