MySQLの浮動小数点比較の問題
-
24-09-2019 - |
質問
私は浮動小数点値の比較は常に正しい結果を返さないことにMySQLデータベースのスキーマに浮動小数点の列を導入することで問題に遭遇します。
1から50.12
2から34.57
3から12.75
4 - ...
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
この戻り私 "3" ます。
私は、MySQLでの浮動小数点値の比較は悪い考えで、小数点型は、より良い選択肢であることを読んだことがある。
私はfloat型を進め、任意の希望を持っていますか、正しく仕事との比較を取得する?
解決
あなたは以下の問題に気づいていますか?
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)
他のヒント
私は一度顔に同様の問題をしました。 「小数」に「フロート」フィールドを変換します。これは間違いなく問題を解決します。
私はこの
を行いますWHERE abs(value - 12.75)<0.001
が、私は、任意の言語が格納された値をfloat型の平等を比較した場合にすることができ、同意は、すべての問題があってはならない、あなたが挿入され、正確な数値値に等しい。
小数と完全一致する値のみカップルと、精度の誤差は、MySQL
で、このような不整合のための明白な理由のように聞こえるしません。これは浮動小数点ですので、何が問題なの? 3は正しい結果である可能性があり、データベースは12.75考えるかに依存します。それは12.75であるか、もう少しだけ?
使用DECIMALあなたが正確な数字をしたい場合。
平等のためのフロートの比較に問題があります。これは、予期せぬ結果を与える可能性があります。これは、浮動小数点演算の内部実装によるものです。
の文字列で数を比較すると?
の代わりにFLOATまたはDECIMALの使用REALます。