ホームページ >Java >&#&チュートリアル >Java の浮動小数点数で直接等価比較 ('==') が問題となるのはなぜですか?
Java での浮動小数点比較の難題
Java では、文書化されているように、浮動小数点値をテストするための等価比較演算子 '==' が提供されています。 java.sun で。ただし、静的解析では、浮動小数点を比較するための使用法に関して懸念が生じることがよくあります。
浮動小数点の '==' の落とし穴
'==' 演算子の指定された役割にもかかわらずfloat の比較では、浮動小数点演算に固有の不正確さが原因で問題が発生することがわかります。浮動小数点値は内部的に有限 10 進展開として表現されるため、計算中に丸め誤差や切り捨てが発生します。その結果、論理的に等しいはずの 2 つの浮動小数点数が、ごくわずかに異なる場合があります。この差異は、等しいかどうかを判断するために「==」を使用するときに、偽陽性または偽陰性を引き起こす可能性があります。
浮動小数点数の等価性に対する推奨アプローチ
浮動小数点の「等価性」を正確にテストするには、 ' 絶対差を許容閾値 (イプシロン) と比較することをお勧めします。このイプシロン値は、必要な精度に従ってスケーリングされ、非常に小さい必要があります。
たとえば、sectionID と currentSectionID が float 変数の場合、次のコード スニペットは信頼性の高いメソッドを提供します。
if (Math.abs(sectionID - currentSectionID) < epsilon) { // They are considered 'equal' }
このコンテキストでは、イプシロンは 0.00000001 または必要な精度に基づいたカスタム値に設定できます。 Math.abs を利用することで、比較がオペランドの符号に依存しないことを保証します。
結論
一方、'==' は指定された等価であるように見えます。 float の演算子ですが、浮動小数点の不精度を正確に処理するという欠点があるため、正確な比較には適していません。推奨されるソリューションには、絶対差を適切な許容しきい値と比較して、Java の浮動小数点値の信頼できる同等性評価を提供することが含まれます。
以上がJava の浮動小数点数で直接等価比較 ('==') が問題となるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。