MySQL如何进行浮点加法的数学计算?

Dar*_*iuM 3 mysql sql ieee-754

我使用进行了测试SELECT 0.1 + 0.2;,并使用MySQL(MariaDB)查询,它返回了正确的答案

MariaDB [(none)]> SELECT 0.1 + 0.2;
+-----------+
| 0.1 + 0.2 |
+-----------+
|       0.3 |
+-----------+
1 row in set (0.000 sec)
Run Code Online (Sandbox Code Playgroud)

浮点运算是因为大多数编程语言不准确的IEEE 754作为解释在这里

MySQL的浮点计算如何使其返回正确答案?

Ray*_*and 5

我知道SQL 92是旧标准,但是我敢肯定,在较新的SQL标准版本中这不会更改。

SQL 92定义

73)第6.12款,"<numeric value expression>":当两个操作数的数据类型相加时。减,乘或除运算符是精确数值,结果的精度由实现定义。“ *

75)6.12节,"<numeric value expression>":当算术运算符的任何一个操作数的数据类型为近似数值时,结果的精度由实现定义。“ *

现在的问题是:0.10.2在查询SELECT 0.1 + 0.2一个近似还是精确?
答案是:您也不知道数据库也不知道。
因此,数据库将运行为MySQL和MariaDB引擎定义的实现,将这些接缝视为DECIMAL(1,1)数据类型进行处理

为什么Nick的答案会返回正确的值或带有表定义的期望值

SQL 92也定义

隐式类型转换可以发生在表达式,提取操作
,单行选择操作,插入,删除和更新中。
可以使用CAST
运算符来指定显式类型转换。

Nick通过定义表中的数据类型来完成此工作。

编辑此答案是因为我今天在MySQL手册中找到了一些东西。

查询

SELECT (0.1 + 0.2) = 0.3
Run Code Online (Sandbox Code Playgroud)

结果存入1MySQL,这意味着MySQL使用精确的数值计算,并在可能的情况下使用Precision Math。因此,MySQL确实知道0.10.2并且0.3这里是精确的数据类型,需要计算精确的数据类型,就像我在此编辑之前所期望的那样。

意思查询

SELECT (0.1 + 0.2) = 0.3 
Run Code Online (Sandbox Code Playgroud)

会或多或少地在引擎盖下运行

SELECT CAST((0.1 + 0.2) AS DECIMAL(1, 1)) = CAST((0.3) AS DECIMAL(1, 1));
Run Code Online (Sandbox Code Playgroud)