Geoffrey De Smet Geoffrey De Smet - 1 month ago 5x
Java Question

How do I check if a BigDecimal is in a Set or Map in a scale independent way?


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
, 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


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()) {