質問:
2つの二重タイプの値で操作を実行する場合、異常な結果値に問題がある場合があります。例えば:
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.989999999999999999995
0.3399999999999999999997
3.30000000000000003
0.1230000000000001
解決:
Javaの単純なフローティングポイントタイプはフロートとダブルで操作を実行できません。これはほとんどの場合に正常であるため、上記の問題が発生する場合があります。この問題は、実際にはJavaのバグではありません。これは、コンピューター自体がバイナリであり、浮動小数点数は実際にはほんの少しの値であるためです。したがって、バイナリから小桁の浮動小数点数に変換されると、精度は簡単に失われ、精度が低下します。
精度を確保するには、BigDecimalクラスを使用する必要があり、ダブルからBigDecimalに直接変換することはできません。 2倍の文字列に変換し、次にBigDecimalに変換する必要があります。つまり、BigDecimal(Double Val)メソッドを使用することはできず、効果がないことがわかります。 BigDecimal(String Val)メソッドを使用します。具体的な例を以下に示します。
ダブルタイプの4つの操作の例:
1。加算
public static double add(double a1、double b1){bigdecimal a2 = new bigdecimal(double.tostring(a1)); BigDecimal B2 = new BigDecimal(double.Tostring(B1)); 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)); 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)); 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のダブルタイプの異常な操作結果の解決策は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。