gpt4 book ai didi

MySQL 疯狂 (?) 浮点行为

转载 作者:行者123 更新时间:2023-12-04 08:58:54 27 4
gpt4 key购买 nike

在 MySQL 8.0.21 上,我有一个空表 ( Tbl ),只有一列: num , 类型 float .
我插入一行,值为 0.1 :

INSERT INTO Tbl(num) VALUES(0.1)
我运行以下查询并获得预期值 0.1 :
SELECT MAX(num) FROM Tbl
现在,我运行一个我认为在语义上等同于第一个查询的查询,并得到 0.10000000149011612 :
SELECT MAX(IF(TRUE, num, 0)) FROM Tbl
有趣的是,如果没有 MAX,这种行为就不会重现。 ,即以下返回 0.1 :
SELECT IF(TRUE, num, 0) FROM Tbl
我知道浮点数不能总是准确表示,我理解为什么算术运算会导致这种问题,但为什么要使用这个 IFMAX做出改变?

最佳答案

它们返回不同的类型。当您使用 MAX() 时,它会将浮点值上采样为 double 值:

CREATE TABLE T_MAX AS SELECT MAX(IF(TRUE, num, 0)) AS max_num FROM Tbl;

mysql> SHOW CREATE TABLE T_MAX\G
*************************** 1. row ***************************
Table: T_MAX
Create Table: CREATE TABLE `T_MAX` (
`max_num` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8


CREATE TABLE T_IF AS SELECT IF(TRUE, num, 0) AS if_num FROM Tbl;

mysql> SHOW CREATE TABLE T_IF\G
*************************** 1. row ***************************
Table: T_IF
Create Table: CREATE TABLE `T_IF` (
`if_num` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我们可以在不执行 MAX() 的情况下进行从 float 到 double 的转换,并看到相同的效果:
mysql> SELECT CAST(num AS DOUBLE) AS dblnum FROM TBL;
+---------------------+
| dblnum |
+---------------------+
| 0.10000000149011612 |
+---------------------+
请注意,如果我们将原始存储的 num 设为 double,则不需要进行转换,因此不会更改表示形式。
CREATE TABLE TBL2 (num DOUBLE);

INSERT INTO TBL2 (num) VALUES (0.1);

SELECT MAX(IF(TRUE, num, 0)) AS num FROM TBL2;
+------+
| num |
+------+
| 0.1 |
+------+
因此,引入问题的是将 float 转换为 double 。

关于MySQL 疯狂 (?) 浮点行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63659098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com