一些有趣的观察结果w.r.t等于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。
在两种情况下看起来都在进行字符串比较。任何人都可以对此有所了解。
感谢。
答案 0 :(得分:63)
BigDecimal'equals'比较值和比例。如果您只想比较值(0 == 0.0),则应使用compareTo:
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true
请参阅javadoc。
对于Double比较,正如其他答案所解释的那样,您将new Double(0.0).equals(0)
中的Double与Integer进行比较,返回false
,因为对象具有不同的类型。作为参考,code for the equals method in JDK 7是:
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
在您的情况下,(obj instanceof Double)
是错误的。
答案 1 :(得分:5)
第一个表达式中的0被解释为int
,可以将其自动装箱到Integer
,但不能自动装入Double
。所以两者的类型不同,因此它们不相等。 OTOH 0.0
是一个double
,它被自动装入Double
,因此这两个操作数被视为相同。
BigDecimals还包含一个比例(即小数点分隔点右侧的位数)。 BigDecimal.ZERO
的值为“0”,因此其标度为0.因此它不等于“0.0”,其标度为1.
如果要比较值,请使用BigDecimal.compareTo
:
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0
答案 2 :(得分:1)
new Double(0.0).equals(0); //false
,因为您传递的参数是整数。 Double 类中的 equels()检查参数是否为od实例 Double 或不使用 运算符实例
Double 的等于()方法。
if (!(argument instanceof Double))
return false;
您传递的参数是整数,它不是 Double 的实例,因此返回false。
答案 3 :(得分:1)
new Double(0.0).equals(0)实际上是这样的:
new Double(0.0).equals(Integer.valueOf(0))
Double.equals(...)永远不会返回true,除非给出另一个Double实例。
答案 4 :(得分:0)
new Double(0.0).equals(0)
此行将double值0(不是精确为零)与整数0进行比较。
BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))
BigDecimal将比较equals操作中的比例长度。
答案 5 :(得分:0)
出于性能考虑,BigDecimal,BigInteger缓存小值 BigDecimal(无分数)时0到15
BigDecimal.ZERO将是新的BigDecimal(BigInteger.ZERO,0,0,1) &安培; valueOf方法通常从缓存中获取0到15:)
答案 6 :(得分:0)
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");
}