ホームページ > 記事 > コンピューターのチュートリアル > JAVA での倍精度の問題に対処する方法
パブリック静的 double add(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.add(b2).doubleValue();
}
パブリック静的ダブルサブ(ダブルd1,ダブルd2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.subtract(b2).doubleValue();
}
パブリック静的 double mul(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.multiply(b2).doubleValue();
}
パブリック静的 double div(double d1,double d2){
return div(d1,d2,DEF_DIV_SCALE);
}
パブリック静的 double div(double d1,double d2,int スケール){
//scale は小数点以下に保持する桁数です。
if(scalethrow new IllegalArgumentException ("精度をゼロ未満にすることはできません");
}
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
これらのメソッドを使用する場合は呼び出してください。
ほとんどの場合、double と float を使用して計算された結果は正確ですが、高精度が必要な一部のシステムでは、この問題は非常に深刻です。
「Effective Java」で述べられている原則として、float と double は科学計算または工学計算にのみ使用できますが、商用計算では java.math.BigDecimal を使用する必要があります。問題がある場合、コード例は次のとおりです:
パッケージ例;
import java.math.*;
パブリック クラス BigDecimalDemo {
public static void main(String[] args){
System.out.println(ArithUtil.add(0.01, 0.05));
System.out.println(ArithUtil.sub(1.0, 0.42));
System.out.println(ArithUtil.mul(4.015, 100));
System.out.println(ArithUtil.div(123.3, 100));
}
}
クラス ArithUtil{
プライベート静的最終整数DEF_DIV_SCALE=10;
プライベート ArithUtil(){}
###//追加###パブリック静的 double add(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.add(b2).doubleValue();
}
//減算
パブリック静的ダブルサブ(ダブルd1,ダブルd2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.subtract(b2).doubleValue();
}
###//かける###パブリック静的 double mul(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.multiply(b2).doubleValue();
}
###//分割###パブリック静的 double div(double d1,double d2){
return div(d1,d2,DEF_DIV_SCALE);
}
パブリック静的 double div(double d1,double d2,int スケール){
if(スケール
throw new IllegalArgumentException("スケールは正の整数またはゼロでなければなりません");
}
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
double と int に関する Java の質問
2 つの int 値を除算した場合、結果は int となり、得られた値は小数部から直接削除されます。
###もし:###int i=1;j=3;i/j==0 は true を返します
double res=i/j の場合、返される結果は 0.333... ではなく 0
になります。0.333... を取得したい場合は、res=((double)i)/j;
が必要です。 ###とあなたの###fReuslt=(int)((double)num1/num2)
Num1/num2 が最初に実行されます。num1 と num2 が両方とも int の場合、結果は最終的に int になります。ここでは、num1=6、num2=5 であると仮定すると、num1/num2==1 は 1.2 ではなく true になります。次に、(double) res を再度実行します。ここでの res は num1/num2 なので、res=1 になります。したがって、double の後でも、1.2
ではなく 1 のままです。以上がJAVA での倍精度の問題に対処する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。