26

MySQL データベース スキーマに浮動小数点列を導入したことで、浮動小数点値の比較が常に正しい結果を返さないという問題に遭遇しました。

1 - 50.12
2 - 34.57
3 - 12.75
4 - ...(残りはすべて 12.00 未満)

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"

これは「3」を返します。

MySQL で浮動小数点値を比較するのは良くない考えであり、10 進数型の方が適切なオプションであると読みました。

float 型を先に進めて、比較を正しく機能させる希望はありますか?

4

8 に答える 8

31

以下の問題に気づきましたか?

CREATE TABLE a (num float);

INSERT INTO a VALUES (50.12);
INSERT INTO a VALUES (34.57);
INSERT INTO a VALUES (12.75);
INSERT INTO a VALUES (11.22);
INSERT INTO a VALUES (10.46);
INSERT INTO a VALUES (9.35);
INSERT INTO a VALUES (8.55);
INSERT INTO a VALUES (7.23);
INSERT INTO a VALUES (6.53);
INSERT INTO a VALUES (5.15);
INSERT INTO a VALUES (4.01);

SELECT SUM(num) FROM a;
+-----------------+
| SUM(num)        |
+-----------------+
| 159.94000005722 | 
+-----------------+

それらの行のいくつかの間に余分な0.00000005722広がりがあります。したがって、これらの値の一部は、初期化された値と比較するとfalseを返します。

浮動小数点演算と比較の問題を回避するには、次のDECIMALデータ型を使用する必要があります。

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
|   159.94 | 
+----------+
1 row in set (0.00 sec)
于 2010-04-02T15:32:30.893 に答える
5

私はこれをします

WHERE abs(value - 12.75)<0.001

しかし、私は同意します。どの言語でもフロートの等価性を比較でき、格納された値が挿入した正確な数値と等しい場合、問題はないはずです

少数の少数と正確に一致する値のみを使用すると、精度エラーはMySQLでのそのような不一致の明らかな理由のようには聞こえません

于 2017-04-07T07:02:20.307 に答える
2

私は一度同様の問題に直面しました。「float」フィールドを「decimal」に変換します。それは間違いなく問題を解決します。

于 2010-04-05T07:16:43.327 に答える
1

float の等価性の比較には問題があります。これにより、予期しない結果が生じる場合があります。これは、浮動小数点演算の内部実装によるものです。

于 2010-04-02T15:27:11.793 に答える
0

浮動小数点なので、何が問題なのですか? データベースが 12.75 についてどう考えるかによって、3 が正しい結果になる可能性があります。12.75 ですか、それとももう少しですか。

正確な数値が必要な場合は、DECIMAL を使用します。

于 2010-04-02T15:26:55.180 に答える
0

数値と文字列を比較しますか?

于 2010-04-02T15:28:30.120 に答える
0

10 進比較は、FLOATデータ型の値では機能しません。列のデータ型を に変更するだけですDECIMAL

ALTER TABLE a MODIFY num DECIMAL(6,2);
于 2020-11-06T17:32:00.360 に答える