Umgang mit Problemen mit doppelter Genauigkeit in JAVA

王林
Freigeben: 2024-01-16 12:24:22
nach vorne
963 Leute haben es durchsucht

Umgang mit Problemen mit doppelter Genauigkeit in JAVA

Umgang mit Problemen mit doppelter Genauigkeit in JAVA.比如1 2 3 3 599 996这种

public static 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();

}

public static double sub(double d1,double d2){

BigDecimal b1=new BigDecimal(Double.toString(d1));

BigDecimal b2=new BigDecimal(Double.toString(d2));

return b1.subtract(b2).doubleValue();

}

public static 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();

}

public static double div(double d1,double d2){

return div(d1,d2,DEF_DIV_SCALE);

}

public static double div(double d1,double d2,int scale){

//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只能用来作科学计算或者是工程计算,但在商业Die aktuelle Version von java.math.BigDecimal ist die neueste Version von BigDecimal问题,实例代码如下:

Paket ex;

java.math.* importieren;

öffentliche Klasse 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));

}

}

class ArithUtil{

private static final int DEF_DIV_SCALE=10;

private ArithUtil(){}

//相加

public static 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();

}

//相减

public static double sub(double d1,double d2){

BigDecimal b1=new BigDecimal(Double.toString(d1));

BigDecimal b2=new BigDecimal(Double.toString(d2));

return b1.subtract(b2).doubleValue();

}

//相乘

public static 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();

}

//相除

public static double div(double d1,double d2){

return div(d1,d2,DEF_DIV_SCALE);

}

public static double div(double d1,double d2,int scale){

if(scale

throw new IllegalArgumentException("Die Skala muss eine positive Ganzzahl oder Null sein");

}

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和int的问题

两个int的值作除法运算,得到的为int,而且,得到的值是直接去掉小数部分。

假如:

int i=1;j=3;i/j==0 ist wahr

同理,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 为true, Siehe Abschnitt 1.2再执行(double)res,这里的res就是num1/num2,故res=1,所以double之后仍然为1,而不是1.2

Das obige ist der detaillierte Inhalt vonUmgang mit Problemen mit doppelter Genauigkeit in JAVA. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:docexcel.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage