浮点数的比较是一个普遍存在的问题,下面的程序片断中对两个浮点数做减法运算:
public class Test {
public static void main(String[] args) throws Exception {
System.out.print("6.22-6.0=" + (6.22f-6.0f)); }
}
对上面 Java 程序的输出结果可能会想当然的认为是 0.22,但是,实际结果却是0.21999979,因此,在编程中应尽量避免浮点数的比较,如果非要使用浮点数比较则最好使用范围比较而不要使用“==”比较。
再看一下使用定点数来实现上面的例子:
public class Test {
public static void main(String[] args) throws Exception {
System.out.print("6.22-6.0=" + subtract(6.22,6.0)); }
public static double subtract(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue(); }
}
上面的实例使用 Java 的 BigDecimal 类实现了定点数的精确计算,所以 6.22 减 7.0 的结果和预想的相同,为 6.22-6.0=0.22。
注意:在今后关于浮点数和定点数的应用中,用户要考虑到以下几个原则:
浮点数存在误差问题;
对货币等对精度敏感的数据,应该用定点数表示;
在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较; 要注意浮点数中一些特殊值的处理。