ホームページ >Java >&#&チュートリアル >Java で浮動小数点数の等価比較に「==」を使用するのはなぜ信頼性が低いのでしょうか?また、正しいアプローチは何ですか?

Java で浮動小数点数の等価比較に「==」を使用するのはなぜ信頼性が低いのでしょうか?また、正しいアプローチは何ですか?

DDD
DDDオリジナル
2024-12-23 14:13:15163ブラウズ

Why is using `==` for float equality comparison in Java unreliable and what's the correct approach?

Java における == を使用した浮動小数点等価比較の落とし穴

Java では、浮動小数点数を含む等価比較のための == 演算子が提供されています。ただし、浮動小数点の比較に == を使用すると、予期せぬ信頼性の低い結果が生じる可能性があります。

Java.sun ページで提供されている情報に反して、浮動小数点の比較に == を使用すると、「JAVA0078」のような静的分析の警告がトリガーされる可能性があります。 IDE の == と比較される浮動小数点値。これは、Java の浮動小数点数は IEEE 754 浮動小数点形式を使用して表現されるため、固有の不正確さが生じます。

浮動小数点精度の制限により、浮動小数点値は近似値として格納されます。加算、減算、比較などの演算では、時間の経過とともに蓄積される丸め誤差が生じます。その結果、== を使用した直接比較は、数値が本質的に等しい場合でも false を返す可能性があります。

正しいアプローチ: イプシロンベースの比較

浮動小数点数を確実に比較するには、- Java のポイント値の場合、イプシロンベースの比較を使用することをお勧めします。 == を使用して正確な等しいかどうかをテストする代わりに、2 つの数値間の絶対差がイプシロンと呼ばれる小さなしきい値より小さいかどうかをチェックします。

以下のコード スニペットは、浮動小数点を比較する正しい方法を示しています。

if (Math.abs(sectionID - currentSectionID) < epsilon)

ここで、イプシロンは、偏差の許容範囲を定義する、あらかじめ決められた非常に小さな数値 (例: 0.00000001) です。平等。このアプローチでは、浮動小数点の不正確さによるわずかな誤差が効果的に許容され、信頼性の高い等価性チェックが保証されます。

以上がJava で浮動小数点数の等価比較に「==」を使用するのはなぜ信頼性が低いのでしょうか?また、正しいアプローチは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。