在java中会经常遇到两个浮点类型比较大小的问题,要注意的是浮点数只是一个近似值,比如,1/3在java中是不会通过float或者double精确表示的。
来看下面的例子,d1-d2计算结果由于精度丢失,实际结果并不是1.0;
public static void main(String[] args) {
double d1 = 1.00000001;
double d2 = 0.00000001;
System.out.println(d1-d2);
}
![](https://img.haomeiwen.com/i9801176/9537a0b8756c2a4d.png)
因此禁止使用“==”比较两个浮点数是否相等,如果场景允许,优先使用“<” 或 “>” 比较符,如果确实要比较两个浮点数是否相等,请采用以下两种方式
1. 使用阈值的方式
public static void main(String[] args) {
final double THRESHOLD = .0001;
//Method 1
double f1 = 0.0;
for (int i = 1; i <= 11; i++) {
f1 += 0.1;
}
//Method 2
double f2 = 0.1 * 11;
System.out.println("f1 = " + f1);
System.out.println("f2 = " + f2);
if (Math.abs(f1 - f2) < THRESHOLD)
System.out.println("f1 and f2 are equal using threshold\n");
else
System.out.println("f1 and f2 are not equal using threshold\n");
}
![](https://img.haomeiwen.com/i9801176/6e7d6a04d9fed54c.png)
2. 使用BigDecimal的方式
//Method 1
BigDecimal f1 = new BigDecimal("0.0");
BigDecimal pointOne = new BigDecimal("0.1");
for (int i = 1; i <= 11; i++) {
f1 = f1.add(pointOne);
}
//Method 2
BigDecimal f2 = new BigDecimal("0.1");
BigDecimal eleven = new BigDecimal("11");
f2 = f2.multiply(eleven);
System.out.println("f1 = " + f1);
System.out.println("f2 = " + f2);
if (f1.compareTo(f2) == 0)
System.out.println("f1 and f2 are equal using BigDecimal\n");
else
System.out.println("f1 and f2 are not equal using BigDecimal\n");
![](https://img.haomeiwen.com/i9801176/5aa589fb8a9156b5.png)
网友评论