版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Java在比较浮点数的时候,会出现问题,我们看下面的例子:
public class DoubleLean {
public static void main(String[] args) {
double a=1.23d;
double b=1.21d;
double c=a-b;
//浮点数比较,不靠谱
if (c==0.02d){
System.out.println("相等");
}else{
System.out.println("不相等");
}
}
}
输出的结果,不相等,所以,永远不要这么去比较浮点数,坑死人。
那怎么解决这种问题的呢?
一般可以用两种方式,
一,使用精度估计,只要两个浮点数相差 在一定的精度内的话,我们就认为他们相等。
public class DoubleLean {
public static void main(String[] args) {
double a=1.23d;
double b=1.21d;
double c=a-b;
//解决方法,判断 精度
System.out.println(c);
if (compare(c, 0.02d, 0.0000001d)) {
System.out.println("相等");
}else{
System.out.println("不相等");
}
}
public static boolean compare(double a,double b,double accuracy){
if (Double.isNaN(a) || Double.isNaN(b) || Double.isInfinite(a) || Double.isInfinite(b)) {
return false;
}
return Math.abs(a-b)<accuracy;
}
}
上面的例子中,输出了相等,这个时候,我们可以认为两个变量值相等了。
二、使用java的BigDecimal 比较
import java.math.BigDecimal;
public class DoubleLean {
public static void main(String[] args) {
BigDecimal aa=new BigDecimal("1.23");
BigDecimal bb=new BigDecimal("1.21");
BigDecimal cc=aa.subtract(bb);
BigDecimal dd=new BigDecimal("0.02");
if (cc.compareTo(dd)==0){
System.out.println("相等");
}else{
System.out.println("不相等");
}
}
}
输出也是相等。
至于Java浮点数相比较为什么会不相等,诸位同学可以度娘下,这里就不过多阐述理论知识了。