web-dev-qa-db-ja.com

MySQLでフロートを選択する

次のような識別子と価格に基づいて、テーブルでSELECT一致を実行しようとしています。

SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';

上記はゼロ行を返しますが、price='101.31'ビットを削除すると、正しい行が返されます。

やって...

SELECT * FROM `table`;

上記と同じ行を返し、price='101.31'であることを明確に示します。しかし、selectはそれに一致しません。 =<=に変更すると機能しますが、これは正確な解決策ではありません。

操作が実行される前にMySQL浮動小数点を2桁にキャストして、上記のSELECTを機能させる方法(または他の解決策)はありますか?

ありがとう!

24
Meep3D

小数へのキャストは私のために働きました:

SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);

ただし、最初にprice列をDECIMALにすることを検討してください。 DECIMALは通常、金額を扱うときに使用するのに最適なタイプであると考えられています。

41
Matt Solnit

フロートは本質的に不正確であるため、機能しません。実際の値はおそらく「101.3100000000001」のようになります。最初にROUND()を使用して2桁に丸めるか、浮動小数点数ではなくDECIMAL型を使用することをお勧めします。

11
Eric Petroelje

お金のためにフロートを使用しないでください。

9
jcdyer

今日、私も同じ状況に遭遇し、MySQLのFORMAT関数を使用するだけで解決されました。これは、WHERE句と完全に一致する結果を返します。

_SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2)
_

説明:FORMAT('col name', precision of floating point number)

8
hmasif

これを試してください: SELECT * FROMtableWHEREpricelike101.31;

1
Gerson Diniz

私は解決策を探していましたが、最後に、@ hmasifの解決策を見て来た以前のphp number_format()を使用してそれを行いました。

これを使用すると、フロートが得られます-mysqlの一致:

$floatmatch = number_format((float)$yourfloatvariable,5);

ここで、5は小数点から5つの文字列です。例えば7.93643