我是一个总的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会返回空集?
答案 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的分数。所以它不能完全以二进制格式存储。