在检查新数据库结构时,我发现有人将一个字段从float更改为double。我想知道为什么要这样做,于是我查看了mysql文档,但老实说我并不明白它们之间的区别。
有人可以解释一下吗?
在检查新数据库结构时,我发现有人将一个字段从float更改为double。我想知道为什么要这样做,于是我查看了mysql文档,但老实说我并不明白它们之间的区别。
有人可以解释一下吗?
它们都代表浮点数。 FLOAT
是单精度,而 DOUBLE
是双精度数。
MySQL 用四个字节存储单精度值,八个字节存储双精度值。
浮点数和十进制(数字)数之间存在很大的区别,您可以使用 DECIMAL
数据类型来处理十进制数。这个数据类型用于存储精确的数值数据,不同于浮点数,对于需要保留精确精度的数据,例如货币数据,这非常重要。
也许这个例子可以解释清楚。
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 |
+--------------------+---------+
float(10, 2)
。 - GratefulDouble(双精度浮点数)与 Float(单精度浮点数)非常相似,只不过 Double 的大小是 Float 的两倍,这使得它的精度更高。
我想加上自己的例子,帮助我理解在与其他类型的float
、decimal
和double
相加或相乘时使用值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
);
浮点数有32位(4字节),精确到小数点后8位。 双精度浮点数有64位(8字节),精确到小数点后16位。
如果需要更高的精度,请使用双精度浮点数而不是浮点数。
FLOAT 存储浮点数,精度高达 8 位,占用 4 字节,而 DOUBLE 存储浮点数,精度高达 18 位,占用 8 字节。