2010-01-29 67 views
73

检查新的数据库结构我看到有人将某个字段从float更改为double。想知道为什么,我检查了mysql文档,但是老实说,不明白它们有什么区别。MySQL:float和double有什么区别?

有人可以解释一下吗?

+2

注意[“因为在MySQL中所有的计算都以双精度进行使用FLOAT可能会给你一些意想不到的问题”(http://dev.mysql.com /doc/refman/5.0/en/numeric-type-overview.html) – 2011-04-19 12:08:01

+1

我想你的意思是这个链接:http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html – arun 2014-02-20 03:58:52

+0

这可能更有帮助:http://stackoverflow.com/questions/5150274/difference-between-float-and-decimal-data-type – 2014-03-17 00:03:23

回答

78

它们都表示浮点数。 A FLOAT用于单精度数字,而DOUBLE用于双精度数字。

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

与浮点数和小数(数字)数有很大的不同,您可以使用它与DECIMAL数据类型一起使用。与浮点数不同,这用于存储精确的数字数据值,例如,使用货币数据来保存精确的精度非常重要。

+0

好的,有道理。谢谢! – janpio 2010-01-29 16:04:20

+15

可以用例 – Kailas 2014-04-17 09:11:02

+0

详细说明@Kailas花车四舍五入小数不。十进制(9,3)可以是例如123456.789,而如果您尝试存储123456.789,它将以浮点形式插入123456.0。 – Blake 2018-03-06 20:18:54

26

双打就像漂浮物,除了它们是两倍大的事实。这允许更高的准确性。

+0

请注意,在某点之后浮动和双击。例如100000.1截断为100000作为浮点数。 – Blake 2018-03-06 20:30:51

8

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

49

也许这个例子可以解释。

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

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

+--------------------+---------+ 
| fla+flb   | dba+dbb | 
+--------------------+---------+ 
| 2.4000000953674316 | 2.40 | 
+--------------------+---------+ 
+0

也许一个更好的比较可以给fla和flb 2个小数点。 “浮动(10,2)' – Grateful 2017-11-28 09:26:21

7

浮动有32位(4个字节),8位精度。 Double具有64位(8字节),精度为16位。

如果需要更高的精度,使用代替 的浮动

2

思想我想补充我自己的例子,帮助我增加或与其他float相乘时,decimaldouble区别使用值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 
    );