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

Geo*_*met 10 java bigdecimal

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

new BigDecimal("0.2").equals(new BigDecimal("0.20")) // false
Run Code Online (Sandbox Code Playgroud)

有人质疑它为何如此行事.

现在,假设我有一个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
    ...
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 17

contains()如果您切换HashSeta,TreeSet将按照您的意愿工作.

距离,因为这将决定基于平等最套不同的compareTo()方法,而不是equals()hashCode():

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

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

或者,你可以确保在所有的元素Set都是相同的,最小的规模,通过始终使用stripTrailingZeros(add()和上contains()):

set.add(new BigDecimal("0.20").stripTrailingZeros());
...
if (set.contains(new BigDecimal("0.2").stripTrailingZeros()) {
  ...
}
Run Code Online (Sandbox Code Playgroud)