【发布时间】:2010-01-29 08:50:35
【问题描述】:
检查新的数据库结构,我看到有人将一个字段从浮点数更改为双精度数。想知道为什么,我查看了 mysql 文档,但老实说不明白有什么区别。
谁能解释一下?
【问题讨论】:
标签: mysql
检查新的数据库结构,我看到有人将一个字段从浮点数更改为双精度数。想知道为什么,我查看了 mysql 文档,但老实说不明白有什么区别。
谁能解释一下?
【问题讨论】:
标签: 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)
FLOAT或DOUBLE上使用(10,2);这仅对DECIMAL 有用。在 Float 或 Double 上,它会导致“双舍入”,这会以奇怪的方式表现出来。
Double 就像浮点数一样,只是它们的大小是浮点数的两倍。这样可以提高准确性。
【讨论】:
我想添加我自己的示例,以帮助我在与另一个 float、decimal 和 double 相加或相乘时看到使用值 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
);
【讨论】:
Float 有 32 位(4 字节),精度为 8 位。 Double 有 64 位(8 字节),精度为 16 位。
如果您需要更高的准确性,请改用 Double 浮动。
【讨论】:
FLOAT 存储精度高达 8 位的浮点数,有 4 个字节,而 DOUBLE 存储精度高达 18 位的浮点数,有 8 个字节。
【讨论】: