2

sellerparamsいくつかの列を持つと呼ばれるテーブルがあり、そのうちの 1 つが と呼ばれprobabilityincます。この列のタイプは ですfloat

2 番目のクエリが期待どおりに機能しない理由がわかりません。

最初のクエリと結果

mysql> select id,probabilityinc from temp.sellerparams;
+----+----------------+
| id | probabilityinc |
+----+----------------+
|  1 |            0.3 |
|  2 |            0.3 |
|  3 |            0.3 |
|  4 |            0.4 |
+----+----------------+
4 rows in set (0.01 sec)

2 番目のクエリと結果 (予期しない?)

mysql> select id from temp.sellerparams where probabilityinc=0.4;
Empty set (0.00 sec)

ご覧のとおり、 の行がありprobabilityinc=0.4ます。2番目の選択が空を返すのはなぜですか? これは float 値の内部表現と関係がありますか? その場合、float 型の列に基づいて選択するにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

3

floatの精度はかなり制限されているため、列にはより正確なデータ型を使用する方がよい場合があります。とはいえ、浮動小数点値を比較するときは常に許容値を使用することをお勧めします

select id from temp.sellerparams 
where probabilityinc between (0.4 - epsilon) AND (0.4 + epsilon); 

ここで、イプシロンは許容誤差を表します。たとえば、0.0001

于 2012-06-19T13:55:35.473 に答える
3

列タイプをに変更する必要がありますnumericfloat設計上不正確です。また、0.4のような数値はわずかに異なる場合があります。0.4そのため、数値が次のように格納されている場合、との比較が失敗する可能性があります0.39999999

たとえば、を使用できnumeric(10,5)ます。

ドキュメントを参照してください

于 2012-06-19T13:55:36.310 に答える