数据库
首页 > 数据库> > MySQL如何进行浮点加法的数学计算?

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

作者:互联网

我用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)

由于IEEE 754所述的IEEE 754,浮点计算在大多数编程语言中是不准确的.

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

解决方法:

我知道SQL 92是旧标准,但我很确定在较新的SQL标准版本中没有改变.

SQL 92定义

73)Subclause 6.12, "<numeric value expression>": When the data type
of both operands of the addition. subtraction, multiplication,
or division operator is exact numeric, the precision of the
result is implementation-defined.“*

75)Subclause 6.12, "<numeric value expression>": When the data
type of either operand of an arithmetic operator is approximate
numeric
, the precision of the result is implementation-defined.“*

问题是:查询中的0.1和0.2 SELECT 0.1 0.2近似或是否确切?
答案是:你不知道数据库也无法知道.
因此,数据库将运行为MySQL和MariaDB引擎定义的实现,此接缝将作为DECIMAL(1,1)数据类型处理

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

SQL 92还定义了

Implicit type conversion can occur in expressions, fetch opera-
tions, single row select operations, inserts, deletes, and updates.
Explicit type conversions can be specified by the use of the CAST
operator.

Nick通过在表中定义数据类型来完成.

编辑这个答案,因为我今天在MySQL的手册中找到了一些东西.

查询

SELECT (0.1 + 0.2) = 0.3

在MySQL中结果为1表示MySQL使用精确数值计算并尽可能使用Precision Math.
所以MySQL确实知道0.1,0.2和0.3是这​​里的确切数据类型,并且需要计算精确,就像我在编辑之前所期望的那样.

这意味着查询

SELECT (0.1 + 0.2) = 0.3 

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

SELECT CAST((0.1 + 0.2) AS DECIMAL(1, 1)) = CAST((0.3) AS DECIMAL(1, 1));

标签:mysql,sql,ieee-754
来源: https://codeday.me/bug/20190722/1499811.html