Java中等于零(BigDecimal / Double)的运算符
问题内容:
一些有趣的发现wrt等于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与Integer进行比较new Double(0.0).equals(0)
,这false
是因为对象具有不同的类型而返回。作为参考,JDK
7中equals方法
的代码为:
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
就您而言,(obj instanceof Double)
是错误的。