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

MySQL如何进行浮点加法的数学计算?,mysql,sql,ieee-754,Mysql,Sql,Ieee 754,我用选择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) 在大多数编程语言中,浮点计算是不准确的,因为正如所解释的那样 MySQL如何通过浮点计算返回正确答案?这就是MySQL在数据类型/格式选择方面

我用
选择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)
在大多数编程语言中,浮点计算是不准确的,因为正如所解释的那样


MySQL如何通过浮点计算返回正确答案?

这就是MySQL在数据类型/格式选择方面的智能,因为您没有指定这些值是浮点值。试试这个:

create table test (f float);
insert into test values (0.1), (0.2);
select sum(f) from test
输出:

sum(f)
0.30000000447034836


如果使用双精度,则会得到经典的
0.300000000004
结果

我知道SQL 92是旧标准,但我敢肯定,在较新的SQL标准版本中,这一点没有改变

SQL92定义了

73)第6.12款,
:当数据类型 加法的两个操作数的。减法,乘法,, 或除法运算符为精确数字,则 结果是定义了实现。“*

75)第6.12款,
:当 算术运算符的操作数的类型是近似值 数值,结果的精度由实现定义。“*

问题是:
0.1
0.2
在查询中选择0.1+0.2
近似值还是精确值
答案是:你不知道,数据库也不知道
因此,数据库将运行为MySQL和MariaDB引擎定义的实现,该实现将作为
DECIMAL(1,1)
数据类型处理

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

SQL92还定义了

隐式类型转换可以在表达式中发生,例如-
选项、单行选择操作、插入、删除和更新。
显式类型转换可以通过使用强制转换来指定
接线员

这是Nick通过在表中定义数据类型完成的

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

询问

SELECT (0.1 + 0.2) = 0.3
MySQL中的
1
,这意味着MySQL使用精确的数值计算,并在可能的情况下使用。 所以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));

在大多数编程语言中,它的计算有点错误:你能提供一个不能准确计算
0.1+0.2
的软件的实际例子吗?@GMB在Python中返回
0.300000000000000004
,这里还有很多其他语言的例子=>似乎是正确的,你能解释一下它是如何变得聪明的吗?这对我来说很重要,Thanks@DarkSuniuM不幸的是,我对MySQL的内部结构不太熟悉。我怀疑它只是选择使用
DECIMAL
来保证准确性。“我对MySQL的内部结构不太熟悉。我怀疑它只是选择使用DECIMAL来保证准确性。”事实上@Nick已经证实了这一点(刚刚在手册中找到)MySQL使用精确的数值计算,其中@RaymondNijland感谢更新。很高兴有人证实了这一点——我想我应该更加努力地去打猎。如果我能再次投票支持你的答案,我会的!:-)@DarkSuniuM今天在MySQL的手册中发现了一些新的东西,我编辑了这个问题