mySQL返回空,即使它不应该?

时间:2012-04-10 12:08:59

标签: mysql

我是一个总的mySQL新手,但我不知道如何搜索到这个的答案,所以这就是我把它带到这里的原因:

            DESCRIBE rParam;
            +----------------+---------------+------+-----+---------+-------+
            | Field          | Type          | Null | Key | Default | Extra |
            +----------------+---------------+------+-----+---------+-------+
            | p              | float         | YES  |     | NULL    |       |
            | d              | float         | YES  |     | NULL    |       |
            | LTP            | float         | YES  |     | NULL    |       |
            | LTD            | float         | YES  |     | NULL    |       |
            | alpha          | float         | YES  |     | NULL    |       |
            | N              | smallint(6)   | YES  |     | NULL    |       |
            | g              | float         | YES  |     | NULL    |       |
            | a              | float         | YES  |     | NULL    |       |
            | seed           | float         | YES  |     | NULL    |       |
            | startingWeight | float         | YES  |     | NULL    |       |
            | path           | varchar(1000) | YES  | UNI | NULL    |       |
            | type           | varchar(100)  | YES  |     | NULL    |       |
            +----------------+---------------+------+-----+---------+-------+
            12 rows in set (0.00 sec)


            SELECT p FROM rParam GROUP BY p;

            +--------+
            | p      |
            +--------+
            |      0 |
            |  0.001 |
            |  0.002 |
            |  0.003 |
            |  0.004 |
            |  0.005 |
            | 0.0075 |
            |  0.008 |
            |   0.01 |
            |  0.012 |
            | 0.0125 |
            |  0.014 |
            |  0.015 |
            |   0.02 |
            |  0.025 |
            |   0.03 |
            |  0.035 |
            |   0.04 |
            |   0.05 |
            |    0.1 |
            |    0.2 |
            |    0.3 |
            |    0.4 |
            |    0.5 |
            |    0.6 |
            |    0.7 |
            +--------+
            26 rows in set (0.00 sec)

我可以获得一种查询的结果:

            SELECT p FROM rParam WHERE p=0.5 GROUP BY p;
            +------+
            | p    |
            +------+
            |  0.5 |
            +------+
            1 row in set (0.00 sec)

然而,改变我要求的p值:

            SELECT p FROM rParam WHERE p=0.6 GROUP BY p;
            Empty set (0.00 sec)

但我们可以从第一个输出中清楚地看到有哪些行p = 0.6?这是大多数p值的问题 - 为什么mySQL会返回空集?

2 个答案:

答案 0 :(得分:5)

这听起来像是一个舍入错误。浮点数不能总是以二进制形式精确表示。尝试应用一些epsilon:

SELECT DISTINCT p
FROM rParam
WHERE ABS(p - 0.6) < 0.00001

如果您需要精确的小数,请使用DECIMAL代替FLOAT作为列数据类型。

PS。可能更好地使用SELECT DISTINCT而不是GROUP BY

答案 1 :(得分:2)

值0.6不能精确存储在浮点数中,但0.5可以。浮点数存储为二进制。 1/2可以存储为exaclty,也可以是1/4和3 / 4,1 / 8,3 / 8,5 / 8和7/8。但0.6不能写成分母上幂为2的分数。所以它不能完全以二进制格式存储。