Java如何正确比较浮点数
public class FloatDemo {
public static void main(String[] args) {
double a = 0.1 * 3;
double b = 0.3;
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("======================");
compareDouble(a, b);
System.out.println("======================");
String c = "2.0";
String d = "2.00";
compareBigDecimal(c, d);
}
// 浮点型的比较
public static void compareDouble(double a, double b) {
/*
普通浮点数比较不要直接 == , 包装浮点数比较也不要直接 equals
我们应该 定义一个精度误差值,再结合 Math.abs()方法进行比较
*/
System.out.println("a == b -> " + (a == b));
System.out.println("a.equals(b) -> " + (Double.valueOf(a).equals(Double.valueOf(b))));
final double DIFF = 0.0001;
if (Math.abs(a - b) < DIFF) {
System.out.println("a和b相等");
} else {
System.out.println("a和b不相等");
}
}
//BigDecimal的比较
public static void compareBigDecimal(String x, String y) {
/*
不要直接 equals,因为 equals() 方法会考虑位数. 如果数学值是相等,但是位数不同,也会返回false
使用BigDecimal类下的compareTo()方法
*/
BigDecimal c = new BigDecimal(x);
BigDecimal d = new BigDecimal(y);
System.out.println("c.equals(d) -> " + c.equals(d));
boolean f = c.compareTo(d) == 0 ? true : false;
System.out.println("c.compareTo(d) -> " + f);
}
}
小结: 在遇到浮点数的时候,千万不要使用 == 操作符或者包装类型的 equals() 来进行比较,因为有精度问题。要么使用阈值(精度误差值)来忽略舍入的问题,要么使用 BigDecimal 来替代 double 或者 float。