ホームページ > Java > &#&チュートリアル > Javaでの異常なdouble型演算結果の解決策

Javaでの異常なdouble型演算結果の解決策

高洛峰
リリース: 2017-01-23 16:08:32
オリジナル
2196 人が閲覧しました

問題:

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 サイトに注目してください。

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