MySQL の浮動小数点比較が不正確なのはなぜですか?

Susan Sarandon
リリース: 2024-11-07 12:12:02
オリジナル
456 人が閲覧しました

Why Are MySQL Floating-Point Comparisons Inaccurate?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート