質問

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

1から50.12
2から34.57
3から12.75
4 - ...

(すべて未満12.00を休ま)
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ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top