浮点数
浮点数
浮点数的比较
在编程语言原理的相关章节中我们讨论了计算机系统中浮点数的底层表示,那么在实际的编程中我们也需要注意浮点数的比较。譬如下面三种比较方式结果都不会符合预期:
// 使用简单类型比较
float a = 0.7f - 0.6f;
float b = 0.8f - 0.7f;
if (a == b) {
System.out.println("true");
} else {
System.out.println("false"); // false
}
// 使用封装类型比较
Float m = Float.valueOf(a);
Float n = Float.valueOf(b);
if (m.equals(n)) {
System.out.println("true");
} else {
System.out.println("false"); // false
}
// 使用 BigDecimal 比较
BigDecimal x = new BigDecimal(0.8f);
BigDecimal y = new BigDecimal("0.8");
if (x.equals(y)) {
System.out.println("true");
} else {
System.out.println("false"); // false
}
我们需要切换到如下的比较方式:
double diff = 1e-6;
if (Math.abs(a - b) < diff) {
System.out.println("true"); // true
} else {
System.out.println("false");
}
BigDecimal a1 = new BigDecimal("0.8");
BigDecimal b1 = new BigDecimal("0.7");
BigDecimal c1 = new BigDecimal("0.6");
if (a1.subtract(b1).equals(b1.subtract(c1))) {
System.out.println("true"); // true
} else {
System.out.println("false");
}
在实际的项目中,货币之类的精确表示使用整型来存储计算,表示上进行数制的互相转化。