MySQL 浮動小数点比較の異常
浮動小数点数は、その不正確な性質により、比較で予期しない結果を引き起こすことで一般に悪名高いです。 MySQL もこの動作の例外ではありません。
次のシナリオを想像してください。浮動小数点値を格納する「points」という名前の列を持つ MySQL テーブルです。
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
のようなクエリを実行すると、12.75 より大きい値が 4 つあるため、3 が返されることが予想されます。ただし、MySQL は 2 のみを返す場合があります。
この動作は、コンピュータでの浮動小数点演算の実装方法の結果です。コード内で値を「12.75」または「50.12」として保存しているにもかかわらず、これらの値は内部的には近似値として保存されることがよくあります。
浮動小数点演算ミスの内部
へこれを説明するために、いくつかの浮動小数点数の単純な合計を考えてみましょう。
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;
このクエリは、「159.94」ではなく「159.94000005722」のような結果を返す可能性があります。この余分な「0.00000005722」は、浮動小数点演算内部の丸め誤差の結果です。
DECIMAL 型の問題を修正する
このような不正確さを回避するには、次のことをお勧めします。 DECIMAL データ型を使用します。 DECIMAL は、浮動小数点近似に依存するのではなく、固定桁数の文字列として値を表します。
ALTER TABLE a MODIFY num DECIMAL(6,2); SELECT SUM(num) FROM a;
この変更により、SUM クエリは予想される結果「159.94」を返すようになります。
結論
浮動小数点型は一部のアプリケーションでは便利ですが、MySQL ではその比較動作が信頼できない場合があります。正確な比較と計算を行うには、代わりに DECIMAL データ型を使用することを強くお勧めします。
以上がMySQL が浮動小数点数を比較すると予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。