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