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的手册中发现了一些新的东西,我编辑了这个问题