浮動小数点値の比較: Java における等価性の落とし穴
Java のドキュメントでは == が浮動小数点の等価演算子として機能することが示されているにもかかわらず、ポイント番号を比較に使用すると、懸念が生じる可能性があります。例に示すように:
if(sectionID == currentSectionID)
静的分析を呼び出すと、エラー「JAVA0078 浮動小数点値が == と比較されました。」がトリガーされます。その理由は、バイナリ浮動小数点表現の固有の制限にあります。
浮動小数点値を == と比較することは、リンゴとオレンジを比較するのと似ています。これらの値は正確な表現ではなく近似値であるため、同じ値であっても異なるバイナリ表現が生成される場合があります。その結果、== は基になる浮動小数点値ではなく、変数メモリ アドレスの内容をチェックします。
正しいアプローチ
この問題に対処するには、推奨されるアプローチは、許容しきい値に基づいて浮動小数点値を比較することです。 「等しい」テストは次のようになります。
if(Math.abs(sectionID - currentSectionID) < epsilon)
ここで、イプシロンは、必要な精度レベルに合わせて調整された 0.00000001 のような微小な数を表します。このメソッドは、2 つの浮動小数点値間の絶対差がしきい値イプシロンより小さいかどうかを評価します。そうである場合、それらは指定された許容範囲内で「等しい」とみなされます。
結論
== 演算子は浮動小数点値を比較する簡単な方法を提供しますが、その欠点には注意が必要です。不正確さや信頼性の低い比較を回避するには、前述の許容差ベースのアプローチを活用して、浮動小数点比較の精度と信頼性を確保することをお勧めします。
以上がJava で浮動小数点数を比較するために「==」を使用すると問題があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。