BigDecimal的equals()方法也比较标度,所以
new BigDecimal("0.2").equals(new BigDecimal("0.20")) // false这是有争议为什么它的行为像这样。
现在,假设我有一个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
...
}发布于 2013-11-20 09:30:51
如果您将contains()切换到TreeSet,它将按您的意愿工作。
它不同于大多数集合,因为它将根据compareTo()方法决定相等,而不是equals()和hashCode()。
TreeSet实例使用其
compareTo(或compare)方法执行所有元素比较
因为BigDecimal.compareTo()不考虑规模,所以这正是你想要的。
Alternatively --您可以确保Set中的所有元素都是相同的、最小规模的,方法是始终使用stripTrailingZeros (在add()上和在contains()上):
set.add(new BigDecimal("0.20").stripTrailingZeros());
...
if (set.contains(new BigDecimal("0.2").stripTrailingZeros()) {
...
}发布于 2013-11-20 09:17:57
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.发布于 2013-11-20 09:24:38
使用compareTo方法的BigDecimal。
BigDecimal("0.200").compareTo(new BigDecimal("0.2")) == 0; // Means they are equal.来自JavaDoc
将此BigDecimal与指定的BigDecimal进行比较。该方法认为值相等但具有不同规模(如2.0和2.00)的两个BigDecimal对象是相等的。对于六个布尔比较运算符(<,==,>,>=,!=,<=)中的每一个,该方法都优先于单独的方法。用于执行这些比较的建议成语是:(x.compareTo(y)
<op>0),其中<op>是六个比较运算符之一。
https://stackoverflow.com/questions/20091723
复制相似问题