在Java中等于运算符为零(BigDecimal / Double)

时间:2012-04-03 11:06:45

标签: java double precision bigdecimal zero

一些有趣的观察结果w.r.t等于0和0.0

上的运算符
  1. new Double(0.0).equals(0)返回false,而new Double(0.0).equals(0.0)返回true。

  2. BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))返回false,而BigDecimal.ZERO.equals(BigDecimal.valueOf(0))返回true。

  3. 在两种情况下看起来都在进行字符串比较。任何人都可以对此有所了解。

    感谢。

7 个答案:

答案 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)

  1. 第一个表达式中的0被解释为int,可以将其自动装箱到Integer,但不能自动装入Double。所以两者的类型不同,因此它们不相等。 OTOH 0.0是一个double,它被自动装入Double,因此这两个操作数被视为相同。

  2. 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");
}