Geoffrey De Smet - 1 year ago 53

Java Question

BigDecimal's

`equals()`

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

`Set<BigDecimal> set = new HashSet<>();`

set.add(new BigDecimal("0.20"));

...

if (set.contains(new BigDecimal("0.2")) { // Returns false, but should return true

...

}

Answer Source

`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()) {
...
}
```