如何以与比例无关的方式检查BigDecimal是否在Set或Map中?

时间:2013-11-20 09:16:53

标签: java bigdecimal

BigDecimal' equals()方法也比较了比例,所以

new BigDecimal("0.2").equals(new BigDecimal("0.20")) // false

contested为什么它会像那样。

现在,假设我有一个Set<BigDecimal>如何检查该集合中是否有0.2,是否与比例无关?

Set<BigDecimal> set = new HashSet<>();
set.add(new BigDecimal("0.20"));
...
if (set.contains(new BigDecimal("0.2")) { // Returns false, but should return true
    ...
}

3 个答案:

答案 0 :(得分:17)

如果您将contains()切换为a TreeSet

HashSet将按您的意愿运作。

它与大多数集不同,因为它将基于compareTo()方法而不是equals()hashCode()来决定相等性:

  

TreeSet实例使用其compareTo(或compare)方法执行所有元素比较

由于BigDecimal.compareTo()比较而不考虑比例,这正是你想要的。

或者您可以始终使用stripTrailingZeros两者)确保Set中的所有元素都具有相同的最小比例add()contains()):

set.add(new BigDecimal("0.20").stripTrailingZeros());
...
if (set.contains(new BigDecimal("0.2").stripTrailingZeros()) {
  ...
}

答案 1 :(得分:0)

HashSet#contains方法无法满足您的要求,它隐式调用equals方法。您应该迭代Set并使用compareTo方法。如果找到值而不是设置标志。

    Set<BigDecimal> set = new HashSet<>();
    set.add(new BigDecimal("0.20"));
    boolean found=false;
    for (BigDecimal bigDecimal : set) {
        if(bigDecimal.compareTo(new BigDecimal("0.2"))==0){
            System.out.println("Value is contain");
            found=true;
            break;
        }
    }
    if(found)// Use this flag for codition.

答案 2 :(得分:-1)

使用BigDecimal的compareTo方法。

BigDecimal("0.200").compareTo(new BigDecimal("0.2")) == 0; // Means they are equal.

来自JavaDoc

  

将此BigDecimal与指定的BigDecimal进行比较。这个方法认为两个值相等但具有不同比例(如2.0和2.00)的BigDecimal对象是相同的。优选地为六个布尔比较运算符(&lt;,==,&gt;,&gt; =,!=,&lt; =)中的每一个提供单独的方法。建议用于执行这些比较的习惯是:(x.compareTo(y)<op> 0),其中<op>是六个比较运算符之一。