ホームページ  >  記事  >  コンピューターのチュートリアル  >  JAVA での倍精度の問題に対処する方法

JAVA での倍精度の問題に対処する方法

王林
王林転載
2024-01-16 12:24:22965ブラウズ

JAVA での倍精度の問題に対処する方法

JAVA は倍精度の問題をどのように解決しますか。たとえば、1 2 3 3 599 996 この

パブリック静的 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();

}

これらのメソッドを使用する場合は呼び出してください。

Java で double と float を使用して計算するときに精度が時々不正確になる場合はどうすればよいですか

ほとんどの場合、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 を返します

同様に、i/3==0 1/3==0 1/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 サイトの他の関連記事を参照してください。

声明:
この記事はdocexcel.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。