MySQL 浮動小数点比較の問題 質問する

MySQL 浮動小数点比較の問題 質問する

MySQL データベース スキーマに浮動小数点列を導入すると、浮動小数点値の比較で必ずしも正しい結果が返されないという問題が発生しました。

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

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

結果は「3」になります。

MySQL で浮動小数点値を比較するのは良くなく、小数点型の方がよい選択肢であると読みました。

float 型を使用して比較を正しく実行できる見込みはありますか?

ベストアンサー1

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

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)

おすすめ記事