美文网首页
java 两个double比较大小

java 两个double比较大小

作者: 一路花开_8fab | 来源:发表于2018-11-30 20:31 被阅读0次

在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);
    }
image.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");
    }
image.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");
image.png

参考链接

  1. https://howtodoinjava.com/java/basics/correctly-compare-float-double/
  2. https://howtodoinjava.com/java/basics/correctly-compare-float-double/

相关文章

网友评论

      本文标题:java 两个double比较大小

      本文链接:https://www.haomeiwen.com/subject/xmckcqtx.html