0

我是一个完整的 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 返回空集?

4

2 回答 2

5

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

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

如果您想要精确的小数,请使用DECIMAL而不是FLOAT作为列数据类型。

附言。可能更好地使用SELECT DISTINCT而不是GROUP BY.

于 2012-04-10T12:12:42.367 回答
2

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

于 2012-04-10T12:15:13.197 回答