How do I check if a BigDecimal is in a Set or Map in a scale independent way?
bigdecimal, java
Solution
`contains()` will work as you want it to if you switch your `HashSet` to a `TreeSet`.
It is different from most sets as it will decide equality based on the `compareTo()` method as opposed to `equals()` and `hashCode()`:
a TreeSet instance performs all element comparisons using its `compareTo` (or `compare`) method
And since `BigDecimal.compareTo()` compares without regard to scale, that's exactly what you want here.
Alternatively you could ensure that all elements in the `Set` are of the same, minimal scale, by always using `stripTrailingZeros` (both on `add()` and on `contains()`):
set.add(new BigDecimal("0.20").stripTrailingZeros());
...
if (set.contains(new BigDecimal("0.2").stripTrailingZeros()) {
...
}
Problem
BigDecimal's `equals()` method compares scale too, so ``` new BigDecimal("0.2").equals(new BigDecimal("0.20")) // false ``` It's contested why it behaves like that. Now, suppose I have a `Set<BigDecimal>`, how do I check if 0.2 is in that Set, scale independent? ``` Set<BigDecimal> set = new HashSet<>(); set.add(new BigDecimal("0.20")); ... if (set.contains(new BigDecimal("0.2")) { // Returns false, but should return true ... } ```