Double での小数位の操作: 丸め誤差の解決
精度は、特に浮動小数点データを扱う場合、数値演算の重要な側面です。ダブルのようなタイプ。乗算や除算を使用して小数点以下の桁を移動しようとすると、丸め誤差という問題が発生します。この記事では、double での小数点以下の桁の移動の微妙な違いを検証し、丸め誤差を軽減する手法を検討します。
問題: 乗算を使用した小数点以下の桁の移動
1234 が次のようなシナリオを考えてみましょう。 double に格納されており、目標は小数点を移動して 12.34 を取得することです。以下のコード スニペットに示すように、1234 に 0.1 を 2 回乗算しても、期待どおりの 12.34 という結果は得られません。
double x = 1234; for(int i=1;i<=2;i++) { x = x*.1; } System.out.println(x); // Prints: 12.340000000000002
原因: 浮動小数点表現の不正確さ
根本的な問題は、0.1 を double で正確に表現できないことです。乗算を 2 回実行すると、この誤差がさらに増大し、最終的な値にわずかな誤差が生じます。
解決策: 10 のべき乗による除算
誤差の複合を避けるために、除算を検討してください。代わりに x を 100 倍します。 100 は double で正確に表現できるため、このアプローチでは正しい結果が得られます。
double x = 1234; x /= 100; System.out.println(x); // Prints: 12.34
BigDecimal: 正確な算術演算
絶対精度が必要なシナリオの場合は、次の使用を検討してください。 BigDecimal。 double や float とは異なり、BigDecimal は丸めエラーなしで 10 進算術を処理できます。ただし、プリミティブ数値型と比較してパフォーマンスが低下する可能性があります。
丸め誤差: 理解と軽減
浮動小数点計算には丸め誤差がつきものです。倍精度では 15 ~ 16 の有効数字が許容されるため、複数の操作で小さな丸め誤差が蓄積される可能性があります。上で示したように、10 の累乗による除算はこれらのエラーを軽減するのに役立ちますが、すべてのシナリオで確実に実行できるわけではありません。
除算と乗算に関する注意
重要です丸め誤差の不一致のため、x / 100 と x * 0.01 は互換性がないことに注意してください。除算は x の値に依存しますが、0.01 には固定の丸め誤差があります。
以上が丸め誤差を最小限に抑えながら倍精度の小数点以下の桁を正確にシフトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。