MySQL 浮動小数点比較の不完全性
MySQL データベース スキーマに浮動小数点列を導入することは有用であることが証明されていますが、浮動小数点値を含む比較では、結果が生じる場合があります。
説明するには:
次の値を含むポイント列を持つテーブルを考えます:
1 - 50.12 2 - 34.57 3 - 12.75 4 - ...(all other values are less than 12.00)
クエリの実行:
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
予期せず「3」を返します。
MySQL の浮動小数点値の比較では不一致が発生しやすいこと、およびそのような比較には 10 進データ型の方が良い選択であることは既知の事実です。
Float 型を引き続き使用できますか?
浮動小数点の正確な比較には一般に DECIMAL データ型を使用することが推奨されますが、次の点に注意している場合は、引き続き float 型を使用できます。その潜在的な落とし穴。このような落とし穴の 1 つは、計算中にわずかな精度が失われる可能性があることです。
たとえば、次のテーブルについて考えてみましょう:
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.94000005722
予期しない "0.00000005722" に注意してください。このような丸め誤差により、比較に不一致が生じる可能性があります。
このような問題を軽減するには、float 列を指定された精度と位取りで DECIMAL データ型に変換できます。例:
ALTER TABLE a MODIFY num DECIMAL(6,2); SELECT SUM(num) FROM a;
結果は次のようになります:
159.94
DECIMAL データ型を使用すると、正確な比較を保証し、MySQL の浮動小数点値に関連する精度の問題を回避できます。 .
以上がMySQL の浮動小数点比較が不正確なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。