Mysql 为什么59.95可以精确地存储在双精度存储中?

Mysql 为什么59.95可以精确地存储在双精度存储中?,mysql,floating-point,precision,Mysql,Floating Point,Precision,我在MySql中创建了一个新表5.7.27-0ubuntu0.18.04.1 该表包含一个double列a和一个float列b。两列都使用IEEE 754格式。我将数字59.95存储在两个字段中。该数字不能用二进制表示为有限数 float列的输出如下所示: SELECT b*100000000 FROM `test` where id=1 5995000076.293945 及 没有结果。两者都如预期的那样。但是,对于双栏,我得到以下结果: SELECT a*100000000 FROM `

我在MySql中创建了一个新表
5.7.27-0ubuntu0.18.04.1

该表包含一个
double
a
和一个
float
b
。两列都使用IEEE 754格式。我将数字59.95存储在两个字段中。该数字不能用二进制表示为有限数

float列的输出如下所示:

SELECT b*100000000 FROM `test` where id=1
5995000076.293945

没有结果。两者都如预期的那样。但是,对于双栏,我得到以下结果:

 SELECT a*100000000 FROM `test` where id=1
5995000000

返回id为1的行


看起来,
double
列能够精确地存储
59.95
,尽管这个数字不能精确地存储在二进制中。这是怎么可能的?

当52.95转换为IEEE-754二进制32(用于
float
)时,结果是59.950000762939453125。将其转换为IEEE-754二进制64(用于
double
)时,结果为59.9500000000000028421709430404007434844970703125

在语句
SELECT*FROM`test`where b=“59.95”
中,文本
59.95
转换为
double
,产生59.95000000284217094304040074348449703125

尝试从
float
数据中选择此项不会产生任何结果,因为没有
float
数据的值为59.95000000000000284217094304040074348449703125。它只能具有59.950000762939453125的值

尝试从
double
数据中选择此项会产生结果,因为
double
数据的值可能为59.9500000000000028421709430404007434844970703125

您可以根据转换为
float
的值选择所需的
float
数据,例如
CAST('59.95'为float)
。不幸的是,我不熟悉SQL语法,无法确定所需的确切语法


还请注意,在
a*100000000
中,会发生舍入,导致结果为5995000000(可在
double
中表示),而不是5995000000.00000028421709430404007434844970703125(不是)。

它没有准确存储,但它有更多的数字,因此您无法很容易地看到错误。@Barmar如果是这样的话,为什么
会从test where a=“59.95”
中选择*返回这一行?您读过我如何查看存储在mysql中的确切值吗?如果我尝试
a*1000000000000
我会得到
5.99e15
。如果我做了
从..
中选择一个,我只得到
59.90
。我使用phpMyAdmin访问dbAh,如果我选择a-59,我会得到
0.899999999986
 SELECT a*100000000 FROM `test` where id=1
SELECT * FROM `test` where a = "59.95"