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
...
}
答案 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>
是六个比较运算符之一。