浮動小数点インクリメントを含む Java ループで不正確な結果が生成されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-16 08:26:03
オリジナル
400 人が閲覧しました

Why Does My Java Loop With Floating-Point Increments Produce Inaccurate Results?

浮動小数点精度エラー: Java での回避

精度エラーは、プログラミングで float や double などの浮動小数点数を処理するときによく発生します。特に反復的な操作や比較を行う場合に顕著です。この問題を理解するには、次の Java コードを考慮してください:

for ( float value = 0.0f; value < 1.0f; value += 0.1f )
    System.out.println( value );
ログイン後にコピー

毎回値を 0.1 ずつ増分して出力することを目的としていますが、出力では驚くほどエラーが蓄積されていることがわかります:

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
ログイン後にコピー

エラーの原因

原因は、コンピュータの浮動小数点システムの小数部の不正確な表現にあります。具体的には、標準ハードウェアでは 0.1 を 2 進浮動小数点数として正確に表すことができません。この結果、わずかな誤差が生じ、それが複数回の反復で増幅され、期待値からの偏差が観測されます。

問題への対処

この精度の問題に対処するには、いくつかのアプローチがあります。雇用される:

1.精度制御

表示目的で、表示される小数点以下の桁数を制限できます。さらに、浮動小数点数が等しいかどうかを比較するときは、潜在的な不正確さを考慮して、小さな許容マージンを考慮してください。

2.代替データ型

浮動小数点数の代替として、正確な算術演算に対応するデータ型を利用することができます。たとえば、Java の BigDecimal クラスは、任意の数の 10 進数を活用することで高精度を提供します。

コード例 (BigDecimal):

BigDecimal step = new BigDecimal("0.1");
for (BigDecimal value = BigDecimal.ZERO;
     value.compareTo(BigDecimal.ONE) < 0;
     value = value.add(step)) {
    System.out.println(value);
}
ログイン後にコピー

このコードは正確ですfloat または double で見られる精度エラーなしで、値 0.1 を繰り返しインクリメントして出力します。

結論

浮動小数点数の精度エラーを理解し、軽減することは、浮動小数点数の精度エラーを理解し、軽減することが重要です。 Java プログラミングで正確な結果を保証します。適切な手法を採用することで、開発者はこの制限を克服し、10 進表現であっても正確な算術演算を実現できます。

以上が浮動小数点インクリメントを含む Java ループで不正確な結果が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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