MySQL:float 和 double 有啥区别?

Posted

技术标签:

【中文标题】MySQL:float 和 double 有啥区别?【英文标题】:MySQL: What's the difference between float and double?MySQL:float 和 double 有什么区别? 【发布时间】:2010-01-29 08:50:35 【问题描述】:

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

谁能解释一下?

【问题讨论】:

请注意"Using FLOAT might give you some unexpected problems because all calculations in MySQL are done with double precision" 我猜你的意思是这个链接:dev.mysql.com/doc/refman/5.0/en/problems-with-float.html 这可能更有帮助:***.com/questions/5150274/… 同样相关:dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html 的第 5 点 w3resource.com/mysql/mysql-data-types.php 【参考方案1】:

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

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

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

【讨论】:

你能举例说明一下吗 @Kailas 浮点数会四舍五入,而小数则不会。 Decimal(9,3) 可以是例如 123456.789,而如果您尝试存储 123456.789,它将被插入为 123456.0 作为浮点数。【参考方案2】:

也许这个例子可以解释。

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

【讨论】:

也许更好的比较是给 fla 和 flb 2 个小数点。 float(10, 2) 不要不要FLOATDOUBLE上使用(10,2);这仅对DECIMAL 有用。在 Float 或 Double 上,它会导致“双舍入”,这会以奇怪的方式表现出来。【参考方案3】:

Double 就像浮点数一样,只是它们的大小是浮点数的两倍。这样可以提高准确性。

【讨论】:

请注意,在某个点之后会出现浮点数和双精度数。例如 100000.1 截断为 100000 作为浮点数。【参考方案4】:

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

1.3 float 添加到不同类型的1.3

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

1.3 float 乘以不同类型的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
    );

【讨论】:

【参考方案5】:

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

如果您需要更高的准确性,请改用 Double 浮动

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于MySQL:float 和 double 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

float和double有啥区别?

浮点类型说明浮float,double有啥区别啊

浮点类型说明浮float,double有啥区别啊

float和int有啥区别?

C语言中int和float有啥区别啊

MySQL中Decimal类型和Float Double的区别