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

后端 未结 3 831
醉酒成梦
醉酒成梦 2021-01-17 17:42

BigDecimal\'s equals() method compares scale too, so

new BigDecimal(\"0.2\").equals(new BigDecimal(\"0.20\")) // false

It\'s c

3条回答
  •  深忆病人
    2021-01-17 18:08

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

提交回复
热议问题