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)

1つのタイプのクエリの結果を取得できます。

            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

これは丸め誤差のように聞こえます。浮動小数点数は、常にバイナリ形式で正確に表現できるとは限りません。イプシロンを適用してみてください。

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

正確な小数が必要な場合は、列のデータ型としてではDECIMALなくを使用してください。FLOAT

ps。おそらくSELECT DISTINCT、の代わりに使用する方が良いでしょうGROUP BY

于 2012-04-10T12:12:42.367 に答える
2

値 0.6 は float に正確に格納できませんが、0.5 は格納できます。浮動小数点数は 2 進数で格納されます。1/2 は正確に格納でき、1/4 と 3/4、1/8、3/8、5/8、7/8 も格納できます。しかし、0.6 は分母が 2 のべき乗の分数として書くことはできません。したがって、バイナリ形式で正確に保存することはできません。

于 2012-04-10T12:15:13.197 に答える