MySQL:float和double有什么区别?

145

在检查新数据库结构时,我发现有人将一个字段从float更改为double。我想知道为什么要这样做,于是我查看了mysql文档,但老实说我并不明白它们之间的区别。

有人可以解释一下吗?


3
请注意,使用 FLOAT 类型可能会导致一些意外的问题,因为 MySQL 中的所有计算都是使用双精度(double precision)执行的。 - David Sykes
1
我猜你指的是这个链接:http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html - arun
这可能更有帮助:https://dev59.com/B2435IYBdhLWcg3w50f4 - Ifti Mahmud
同样相关的是:http://dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html中的第5点。 - rinogo
https://www.w3resource.com/mysql/mysql-data-types.php - Channa
6个回答

125

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

MySQL 用四个字节存储单精度值,八个字节存储双精度值。

浮点数和十进制(数字)数之间存在很大的区别,您可以使用 DECIMAL 数据类型来处理十进制数。这个数据类型用于存储精确的数值数据,不同于浮点数,对于需要保留精确精度的数据,例如货币数据,这非常重要。


46
可以,请问需要什么样的例子加以阐述? - Kailas
6
浮点数会四舍五入,而小数不会。例如,Decimal(9,3) 可能是 123456.789,而如果你尝试将 123456.789 存储为浮点数,它会被插入为 123456.0。 - Blake

105

也许这个例子可以解释清楚。

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 |
+--------------------+---------+

5
也许更好的比较方式是同样将 fla 和 flb 保留两位小数。float(10, 2) - Grateful
6
不要在FLOAT或DOUBLE上使用(10,2),这只对DECIMAL有用。在浮点数或双精度数上使用会导致“双重舍入”,可能会表现为奇怪的方式。 - Rick James
1
此外,根据MySQL文档(https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html),"从MySQL 8.0.17开始,非标准的FLOAT(M,D)和DOUBLE(M,D)语法已被弃用,您应该预计在未来的MySQL版本中将不再支持它。" - William Gérald Blondel

37

Double(双精度浮点数)与 Float(单精度浮点数)非常相似,只不过 Double 的大小是 Float 的两倍,这使得它的精度更高。


1
请注意,浮点数和双精度浮点数在某个点后会四舍五入。例如,100000.1 作为浮点数截断为 100000。 - Blake

27

我想加上自己的例子,帮助我理解在与其他类型的floatdecimaldouble相加或相乘时使用值1.3的区别。

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

14

浮点数有32位(4字节),精确到小数点后8位。 双精度浮点数有64位(8字节),精确到小数点后16位。

如果需要更高的精度,请使用双精度浮点数而不是浮点数


12

FLOAT 存储浮点数,精度高达 8 位,占用 4 字节,而 DOUBLE 存储浮点数,精度高达 18 位,占用 8 字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接