MySQL: What's the difference between float and double?
在检查新的数据库结构时,我看到有人将字段从float更改为double。我想知道为什么,我检查了MySQL文档,但老实说,我不知道有什么区别。
有人能解释吗?
- 注意,"使用float可能会给您带来一些意想不到的问题,因为mysql中的所有计算都是用双精度完成的。"
- 我猜你的意思是这个链接:dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
- 这可能更有用:stackoverflow.com/questions/5150274/…
- 同样相关:dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html上的5点
它们都代表浮点数。FLOAT表示单精度,而DOUBLE表示双精度数。
MySQL使用四个字节作为单精度值,使用八个字节作为双精度值。
与浮点数和十进制(数字)数字有很大的区别,您可以将它们与DECIMAL数据类型一起使用。这用于存储精确的数字数据值,与浮点数不同,在浮点数中,保持精确的精度非常重要,例如货币数据。
- 好吧,说得通。谢谢!
- 你能举例说明一下吗
- @凯拉斯浮点数是四舍五入的,小数则不是。十进制(9,3)可以是123456.789,但是如果您试图存储123456.789,它将作为一个浮点插入123456.0。
也许这个例子可以解释。
我们有一张这样的桌子:
1 2 3 4 5 6 7 8
| +-------+-------------+
| Field | Type |
+-------+-------------+
| fla | float |
| flb | float |
| dba | double(10,2)|
| dbb | double(10,2)|
+-------+-------------+ |
对于第一个差异,我们尝试向每个字段插入一个"1.2"的记录:
表格显示如下:
1 2 3 4 5 6 7
| SELECT * FROM `test`;
+------+------+------+------+
| fla | flb | dba | dbb |
+------+------+------+------+
| 1.2 | 1.2 | 1.20 | 1.20 |
+------+------+------+------+ |
看到不同了吗?
我们尝试下一个例子:
霍拉!我们可以发现如下不同:
1 2 3 4 5
| +--------------------+---------+
| fla+flb | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 | 2.40 |
+--------------------+---------+ |
- 也许更好的比较应该是给fla和flb两个小数点。float(10, 2)
双打就像浮球,除了两倍大。这样可以获得更高的精度。
- 注意,在某个点之后,浮点数和双整数。例如,100000.1作为浮点值截断为100000。
浮点有32位(4字节),精度为8位。double具有64位(8字节)和16位精度。
如果你需要更好的准确度,就用双倍来代替漂浮的
float存储浮点数的精度高达8位,有4个字节;double存储浮点数的精度高达18位,有8个字节。
我想我会添加我自己的例子,帮助我在与另一个FLOAT、DECIMAL和DOUBLE相加或相乘时,使用值1.3看到差异。
添加到不同类型的1.3中的1.3浮点数:
1 2 3
| |float | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6 | 2.60000 | |
1.3浮点数乘以不同类型的1.3:
1 2 3
| | float | double | decimal |
+--------------------+--------------------+--------------+
| 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 | |
这是使用MySQL6.7
查询:
1 2 3 4 5 6 7 8 9
| 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 |
创建表并插入数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 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
); |