問題:
2 つの double 型の値を操作すると、結果の値が異常になる場合があります。例:
System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100);
出力:
39.9899999999999995
0.33999999999999997
3.3000000000000003
0.12300000000000001
解決策:
Java の単純な浮動小数点型 float と double は、ほとんどの場合正常であるため操作できませんが、場合によっては問題が発生することがあります。上図のようなことが起こります。この問題は実際には JAVA のバグではありません。コンピュータ自体は 2 進数であり、浮動小数点数は実際には近似値にすぎないため、2 進数から 10 進数の浮動小数点数に変換すると精度が失われやすく、結果として精度が低下します。
正確性を確保するには、BigDecimal クラスを使用する必要があります。double から BigDecimal に直接変換することはできません。double を文字列に変換してから BigDecimal に変換する必要があります。つまり、BigDecimal(double val) メソッドは使用できず、効果がないことがわかります。 BigDecimal(String val)メソッドを使用します。以下に具体例を示す。
Double型四則演算の例:
1、加算
public static double add(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.add(b2).doubleValue(); }
2、減算
public static double sub(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.subtract(b2).doubleValue(); }
3、乗算
public static double mul(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.multiply(b2).doubleValue(); }
4、除算
public static double div(double a1, double b1, int scale) { if (scale < 0) { throw new IllegalArgumentException("error"); } BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
スケールパラメータが除算でない場合、精度を指定します。
Java での異常な double 型演算結果に対する上記の解決策は、エディターによって共有されたすべての内容です。参考になれば幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。
Java での異常な double 型演算結果の解決策に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。