基于CSS3的3D立方体旋转动画

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。

posted @ 2021-12-20 10:36  只会写error  阅读(743)  评论(0)    收藏  举报