关于 0 和 0.0 的等于运算符的一些有趣的观察
new Double(0.0).equals(0)
返回 false,而 new Double(0.0).equals(0.0)
返回 true。BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))
返回 false,而 BigDecimal.ZERO.equals(BigDecimal.valueOf(0))
返回 true。看起来这两种情况都进行了字符串比较。谁能解释一下这一点。
谢谢。
BigDecimal“等于”比较值和小数位数。如果您只想比较值(0 == 0.0),您应该使用compareTo:
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true
请参阅 javadoc。
至于 Double 比较,正如其他答案所解释的,您正在将 Double 与
new Double(0.0).equals(0)
中的 Integer 进行比较,它会返回 false
,因为对象具有不同的类型。作为参考,JDK 7 中 equals 方法的代码是:
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
就您而言,(obj instanceof Double)
是错误的。
int
Integer
,但不会自动装箱为
Double
。所以两者的类型不同,因此它们不相等。 OTOH
0.0
是一个
double
,它会自动装箱为
Double
,因此两个操作数被视为相等。BigDecimals 还包含一个标度(即小数点分隔符右侧的位数)。
BigDecimal.ZERO
如果要比较值,请使用
BigDecimal.compareTo
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0
new Double(0.0).equals(Integer.valueOf(0))
Double.equals(...) 永远不会返回 true,除非给出另一个 Double 实例。
new Double(0.0).equals(0); //false
Double类中的
equels()检查参数是否为od实例Double或不使用instance of运算符。 Double 的
equals() 方法。
if (!(argument instanceof Double))
return false;
您传递的参数是
,它不是Double
的实例,因此它返回 false。
new Double(0.0).equals(0)
BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))
BigDecimal 将在 equals 运算中比较刻度长度。
出于性能考虑BigDecimal、BigInteger缓存小值 如果是 BigDecimal,则为 0 到 15(无分数)
please try doublevalue instead of compareto if you feel is not as beautiful and readable as or simply need an alternative like below:
BigDecimal a = new BigDecimal("0.00");
BigDecimal b = new BigDecimal("0.0");
BigDecimal c = new BigDecimal("0");
if(a.doubleValue()==BigDecimal.ZERO.doubleValue()) {
System.out.println("a equals");
}
if(b.doubleValue()==BigDecimal.ZERO.doubleValue()) {
System.out.println("b equals");
}
if(c.doubleValue()==BigDecimal.ZERO.doubleValue()) {
System.out.println("c equals");
}