MySQL:float和double有什么区别?

jan*_*pio 98 mysql

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

谁能解释一下?

Dan*_*llo 96

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

MySQL对于单精度值使用四个字节,对于双精度值使用八个字节.

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

  • 你能举例说明吗? (21认同)
  • @Kailas Floats得到舍入而小数则没有.十进制(9,3)可以是例如123456.789,而如果你试图存储123456.789,它将作为浮点数插入123456.0. (4认同)

小智 68

也许这个例子可以解释.

CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2)); 
Run Code Online (Sandbox Code Playgroud)

我们有一个这样的表:

+-------+-------------+
| Field | Type        |
+-------+-------------+
| fla   | float       |
| flb   | float       |
| dba   | double(10,2)|
| dbb   | double(10,2)|
+-------+-------------+
Run Code Online (Sandbox Code Playgroud)

首先,我们尝试在每个字段中插入一条带"1.2"的记录:

INSERT INTO `test` values (1.2,1.2,1.2,1.2);
Run Code Online (Sandbox Code Playgroud)

表格显示如下:

SELECT * FROM `test`;

+------+------+------+------+
| fla  | flb  | dba  | dbb  |
+------+------+------+------+
|  1.2 |  1.2 | 1.20 | 1.20 |
+------+------+------+------+
Run Code Online (Sandbox Code Playgroud)

看到不同的?

我们尝试下一个例子:

SELECT fla+flb, dba+dbb FROM `test`;
Run Code Online (Sandbox Code Playgroud)

你好!我们可以找到这样的不同:

+--------------------+---------+
| fla+flb            | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 |    2.40 |
+--------------------+---------+
Run Code Online (Sandbox Code Playgroud)

  • 不要在“FLOAT”或“DOUBLE”上使用“(10,2)”;仅对“DECIMAL”有用。在 Float 或 Double 上,它会导致“双舍入”,这会以奇怪的方式表现出来。 (6认同)
  • 也许更好的比较是给 fla 和 flb 两个小数点。`浮动(10, 2)` (3认同)

Wil*_*and 28

双打就像浮子一样,除了它们的两倍大.这允许更高的准确性.


小智 11

FLOAT存储浮点数,精度高达8位,有4个字节,而DOUBLE存储浮点数,精度高达18位,有8个字节.


Rav*_*tel 11

Float有32位(4字节),精度为8位. Double有64位(8字节),精度为16位.

如果您需要更高的准确度,请使用Double而不是Float.


Oma*_*mar 8

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

1.3float ADDED为1.3不同类型:

|float              | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6    | 2.60000 |
Run Code Online (Sandbox Code Playgroud)

1.3float由1.3不同类型MULTIPLIED :

| float              | double             | decimal      |
+--------------------+--------------------+--------------+
| 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 |
Run Code Online (Sandbox Code Playgroud)

这是使用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
Run Code Online (Sandbox Code Playgroud)

创建表格和插入数据:

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
    );
Run Code Online (Sandbox Code Playgroud)