MySQL:float和double有什么区别?


110

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

有人可以解释吗?





Answers:


106

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

MySQL将四个字节用于单精度值,并将八个字节用于双精度值。

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


27
您能举例说明吗
Kailas 2014年

4
@Kailas浮点数会四舍五入,而小数点不会。Decimal(9,3)例如可能是123456.789,而如果您尝试存储123456.789,则它将作为浮点数插入为123456.0。
布雷克

76

也许这个例子可以解释。

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

1
也许更好的比较是将fla和flb设置为2个小数点。float(10, 2)
感激

30

双打就像浮点数,除了它们的大小是浮点数的两倍。这允许更高的准确性。


请注意,在某个点之后,浮点数和双数会变圆。例如,100000.1截断为100000作为浮点数。
布莱克

14

我以为我想补充我自己的例子,帮助我使用值看出区别1.3添加或与另一个相乘时floatdecimaldouble

1.3float添加到1.3以下不同类型:

|float              | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6    | 2.60000 |

1.3float MULTIPLIED by 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
    );

11

FLOAT存储的浮点数的精度最高为8个位,并且具有四个字节,而DOUBLE存储的浮点数的精度最高为18个位,并且具有8个字节。


11

浮点数具有8位精度的32位(4字节)。 Double具有16位精度的64位(8字节)。

如果需要更高的精度,请使用Double而不是Float

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.