比较判断双精度数字Double类

Double类提供了多种方法来比较Double对象和检查double值的特性。

compareTo()方法 比较两个Double对象

比较两个Double对象所表示的数值。

✍方法声明

public int compareTo(Double anotherDouble);

  • 📥入参:anotherDouble为要比较的Double值。
  • 🪐返回值:
    • 如果anotherDouble在数字上等于Double,则返回0;
    • 如果anotherDouble在数字上小于Double,则返回-1;
    • 如果anotherDouble在数字上大于Double,则返回1。
    public static void main(String[] args) {
        Double d1 = Double.valueOf("1.234");
        Double d2 = Double.valueOf("99");
        Double d3 = Double.valueOf("-0.01");
        Double d4 = Double.valueOf("+99");
        int i1 = d1.compareTo(d2);
        int i2 = d1.compareTo(d3);
        int i3 = d2.compareTo(d4);
        System.out.println(i1);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println(d2 == d4);
    }
-1
1
0
false

Double 内部没有维护一个缓存对象,因此每次调用 valueOf() 都会创建新的对象。

    public static void main(String[] args) {
        Double d1 = Double.valueOf("1234.0");
        Double d2 = Double.valueOf("-666.99");
        Double d3 = Double.NaN;
        Double d4 = Double.valueOf(Double.MIN_VALUE);
        Double d5 = Double.NaN;
        int i1 = d1.compareTo(d3);
        int i2 = d2.compareTo(d3);
        int i3 = d4.compareTo(d3);
        int i4 = d5.compareTo(d3);
        System.out.println(i1);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println(i4);
    }

任何有意义的数和 NaN 比较都返回 -1。

-1
-1
-1
0

compare() 比较双精度数字对象

比较两个指定的Double值。

✍方法声明

public static int compare(double d1,double d2);

  • 📥入参:
    • dl:要比较的第一个double值。
    • d2:要比较的第二个double值。
  • 🪐返回值:
    • 返回值如果d1在数字上等于d2,则返回0;
    • 如果d1在数字上小于d2,则返回小于0的值-1;
    • 如果d1在数字上大于d2,则返回大于0的值1。

返回整数值的符号与以下调用返回整数的符号相同:new Double(d1).compareTo(new Double(d2))

下面代码通过Double类的compare()方法比较double型变量d1和d2值的大小。

    public static void main(String[] args) {
        Double d1 = Double.valueOf("1.234");
        Double d2 = Double.valueOf("99");
        Double d3 = Double.valueOf("-0.01");
        Double d4 = Double.valueOf("+99");
        int i1 = Double.compare(d1, d2);
        int i2 = Double.compare(d1, d3);
        int i3 = Double.compare(d2, d4);
        System.out.println(i1);
        System.out.println(i2);
        System.out.println(i3);
    }
-1
1
0

equals()方法 判断Double对象是否相等

将此对象与指定对象比较。当且仅当参数不是null而是Double对象,且表示的Double值与此对象表示的double值相同时,结果为true。为此,当且仅当将方法doubleToLongBits(double)应用于两个值所返回的long值相同时,才认为这两个double值相同。

✍方法声明

public boolean equals(Object obj)

  • 📥入参:obj为要比较的对象。
  • 🪐返回值:如果对象相同,则返回true,否则返回false。

在大多数情况下,对于Double类的两个实例d1和d2,当且仅当dl.doubleValue()=d2.doubleValue()为true时,dl.equals(d2)的值才为true。

    public static void main(String[] args) {
        Double d1 = Double.valueOf("1234.0");
        Double d2 = Double.valueOf("1234");
        Double d3 = Double.valueOf("123");
        boolean b1 = d1.equals(d2);
        boolean b2 = d1.equals(d3);
        System.out.println(b1);
        System.out.println(b2);
    }
true
false

但是,有以下两种例外情况:

  • 如果d1和d2都表示Double.NaN,那么即使Double.NaN=Double.NaN值为false,equals方法也将返回true。
  • 如果d1表示+0.0而d2表示0.0,或者相反,那么即使+0.0=-0.0值为true,equals方法也将返回false。

此定义使得哈希表得以正确操作。

    public static void main(String[] args) {
        Double d1 = Double.valueOf("-0.0");
        Double d2 = Double.valueOf("+0.0");
        System.out.println(d1.equals(d2));

        Double d3 = Double.valueOf(Double.NaN);
        Double d4 = Double.valueOf(Double.NaN);
        System.out.println(d3.equals(d4));
    }
false
true

isInfinite() 判断Double值的大小是否是无穷大

判断Double的值大小是无穷大,如果是则返回true,否则返回false。

✍方法声明

public boolean isInfinite();

  • 🪐返回值:如果是无穷大则返回true,否则返回false。

✍方法声明

判断如果指定数的数值是无穷大,则返回true,否则返回false。

public static boolean isInfinite(Double v);

  • 📥入参:v为指定要判断的Double。
  • 🪐返回值:如果指定数的数值是无穷大,则返回true,否则返回false。

下面代码创建Double对象d,并通过Double类的isInfinite()方法判断对象d的参数值是否是无穷大,并将结果赋给boolean型变量。

    public static void main(String[] args) {
        Double d1 = Double.valueOf("-0.0");
        boolean b1 = Double.isInfinite(d1);
        System.out.println(d1 + " isInfinite " + b1);

        Double d2 = Double.valueOf(Double.MAX_VALUE);
        boolean b2 = Double.isInfinite(d2);
        System.out.println(d2 + " isInfinite " + b2);
        System.out.println(d2 + " isInfinite " + d2.isInfinite());


        Double d3 = Double.valueOf(Double.POSITIVE_INFINITY);
        boolean b3 = Double.isInfinite(d3);
        System.out.println(d3 + " isInfinite " + b3);
        System.out.println(d3 + " isInfinite " + d3.isInfinite());
    }
-0.0 isInfinite false
1.7976931348623157E308 isInfinite false
1.7976931348623157E308 isInfinite false
Infinity isInfinite true
Infinity isInfinite true

isNaN() 判断Double值是杏是一个非数字值

如果Double值是一个非数字NaN值,则返回true,否则返回false。

✍方法声明

public boolean isNaN();

  • 🪐返回值:如果Double值是一个非数字NaN值,则返回true,否则返回false。

✍方法声明

如果指定的数是一个NaN值,则返回true,否则返回false。

public static boolean isNaN(double v)

  • 📥入参:v为要判断的值。
  • 🪐返回值:如果参数值为NaN,则返回true;否则返回false。
    public static void main(String[] args) {
        Double d1 = Double.valueOf(Double.NaN);
        boolean b1 = d1.isNaN();
        boolean b2 = Double.isNaN(d1);
        System.out.println(d1 + "  isNaN 1 " + b1 + " isNaN 2 " + b2);
        Double d3 = Double.valueOf(Double.POSITIVE_INFINITY);
        boolean b3 = d3.isNaN();
        boolean b4 = Double.isNaN(d3);
        System.out.println(d3 + "  isNaN 3 " + b3 + " isNaN 4 " + b4);
    }
NaN isNaN 1 true isNaN 2 true
Infinity isNaN 3 false isNaN 4 false

📝总结

💡 compareTo()方法用于比较两个Double对象,而compare()方法用于比较两个double原始类型值。
💡 equals()方法用于比较两个Double对象的值是否相等,但它有一些特殊规则,例如+0.0和-0.0被认为是相等的,而NaN与任何值(除过它自己)都不相等。
💡 isInfinite()方法用于检查数值是否为无穷大,而isNaN()方法用于检查数值是否为NaN。
💡 了解这些方法的正确使用对于处理浮点数比较和检查非常有帮助。

转载请注明出处:码谱记录 » 比较判断双精度数字Double类
标签: