Maison > Article > tutoriels informatiques > Comment gérer les problèmes de double précision en JAVA
double ajout statique public (double d1,double d2){
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourner b1.add(b2).doubleValue();
}
double sous statique public (double d1,double d2){
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourner b1.subtract(b2).doubleValue();
}
double mul statique public (double d1,double d2){
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourne b1.multiply(b2).doubleValue();
}
double div statique publique (double d1,double d2){
retour div(d1,d2,DEF_DIV_SCALE);
}
double div statique publique (double d1, double d2, échelle int){
//scale 是小数点后要保留的位数
if(scalethrow new IllegalArgumentException("精度不能小于零");
}
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourne b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
用的时候调用这几个方法。
在大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要很高的系统中,这种问题是非常严重的。
Java efficace Il s'agit de java.math.BigDecimal et de BigDecimal.问题,实例代码如下:forfait ex;
importer java.math.*;
classe publique 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));
}
}
classe ArithUtil{
private static final int DEF_DIV_SCALE=10;
arithUtil privé(){}
//相加
double ajout statique public (double d1,double d2){
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourner b1.add(b2).doubleValue();
}
//相减
double sous statique public (double d1,double d2){
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourner b1.subtract(b2).doubleValue();
}
//相乘
double mul statique public (double d1,double d2){
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourne b1.multiply(b2).doubleValue();
}
//相除
double div statique publique (double d1,double d2){
retour div(d1,d2,DEF_DIV_SCALE);
}
double div statique publique (double d1, double d2, échelle int){
if(échelle lancer une nouvelle IllegalArgumentException("L'échelle doit être un entier positif ou zéro");
}
BigDecimal b1=nouveau BigDecimal(Double.toString(d1));
BigDecimal b2=nouveau BigDecimal(Double.toString(d2));
retourne b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
Java关于double和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 et num2都int,都到的结果最终会是int,这里假设num1=6,num2=5,则num1/num2==1 为true,而不是1 .2,那么, avec une résolution double)res, une résolution avec une résolution numéro1/num2, une résolution = 1, une résolution double avec 1, avec une résolution 1.2
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!