1. 程式人生 > 其它 >Java如何正確比較浮點數

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。