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
...
}
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
(orcompare
) 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()) {
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With