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