ホームページ >Java >&#&チュートリアル >なぜ二重の精度を失うのか、そしてjavaでそれを避ける方法
Javaでフローティングポイント数を使用する場合、2倍が事故または不正確な結果を生成することがあることに気付くかもしれません。この動作は、特に金融アプリケーションや高度の高度シナリオでエラーを引き起こす可能性があります。
この記事では、この問題の根本原因を調査し、それを回避する方法を説明し、実行可能な例を提供し、更新されたJavaバージョンがより良い代替ソリューションを提供するかどうかを議論します。
なぜ二重の精度が失われるのですか?
11桁
たとえば、バイナリ:
追加/削減方法が繰り返されると、エントリエラーが増幅されます。
実行可能な例:double
によって引き起こされる精度の精度result 0.30000000000000004は、バイナリ表現によって引き起こされる腐敗エラーを強調しています。違いがわずかに取るに足らない場合でも、キーシステムの大きな問題につながる可能性があります。
1。正確な計算にはbigdecimalを使用します
<code class="language-java">public class DoublePrecisionLoss { public static void main(String[] args) { double num1 = 0.1; double num2 = 0.2; double sum = num1 + num2; System.out.println("预期和:0.3"); System.out.println("实际和:" + sum); // 比较 if (sum == 0.3) { System.out.println("和等于0.3"); } else { System.out.println("和不等于0.3"); } } }</code>
JavaのBigdecimalクラスは、任意の精度算術を提供し、高い精度(金融コンピューティングなど)を必要とする理想的な選択肢となっています。 BigDecimalを使用する例:
<code>预期和:0.3 实际和:0.30000000000000004 和不等于0.3</code>
output:
を比較します
精度の損失に対処する別の方法は、浮動点の数を許容範囲(Epsilon)と比較することです。この方法では、正確な平等性に依存するのではなく、数値が「十分に近い」かどうかをチェックします。<code class="language-java">import java.math.BigDecimal; public class BigDecimalExample { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("0.1"); BigDecimal num2 = new BigDecimal("0.2"); BigDecimal sum = num1.add(num2); System.out.println("预期和:0.3"); System.out.println("实际和:" + sum); // 比较 if (sum.compareTo(new BigDecimal("0.3")) == 0) { System.out.println("和等于0.3"); } else { System.out.println("和不等于0.3"); } } }</code>
output:
<code class="language-java">public class DoublePrecisionLoss { public static void main(String[] args) { double num1 = 0.1; double num2 = 0.2; double sum = num1 + num2; System.out.println("预期和:0.3"); System.out.println("实际和:" + sum); // 比较 if (sum == 0.3) { System.out.println("和等于0.3"); } else { System.out.println("和不等于0.3"); } } }</code>
を比較します
<code>预期和:0.3 实际和:0.30000000000000004 和不等于0.3</code>
なぜApache Commons Mathを使用するのですか?
<code class="language-java">import java.math.BigDecimal; public class BigDecimalExample { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("0.1"); BigDecimal num2 = new BigDecimal("0.2"); BigDecimal sum = num1.add(num2); System.out.println("预期和:0.3"); System.out.println("实际和:" + sum); // 比较 if (sum.compareTo(new BigDecimal("0.3")) == 0) { System.out.println("和等于0.3"); } else { System.out.println("和不等于0.3"); } } }</code>単純化された比較
以上がなぜ二重の精度を失うのか、そしてjavaでそれを避ける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。