【发布时间】:2022-01-23 14:59:14
【问题描述】:
我看了Java doc of BigDecimal.equals() says:
将此 BigDecimal 与指定的 Object 进行比较是否相等。 与 compareTo 不同,此方法认为两个 BigDecimal 对象相等 仅当它们在值和规模上相等时(因此 2.0 不等于 用此方法比较时为 2.00)。
但是当我测试它时,不知何故我得到了意想不到的结果,BigDecimal(2.0) 等于BigDecimal(2.00)。而且我认为出于同样的原因,当我将BigDecimal(2.0) 和BigDecimal(2.00) 放入HashSet 时,尺寸为1,而我期望尺寸为2。请参阅下面的代码,如果有人可以指出我是否错过了什么?
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class CollectionTest {
public static void main(String[] args) {
System.out.println(new BigDecimal(2.0).compareTo(new BigDecimal(2.00))); // 0
System.out.println(new BigDecimal(2.0).equals(new BigDecimal(2.00))); // true -- ** UNEXPECTED **
HashSet<BigDecimal> hashset = new HashSet<>();
Set<BigDecimal> treeset = new TreeSet<>();
hashset.add(new BigDecimal(2.0));
hashset.add(new BigDecimal(2.00));
treeset.add(new BigDecimal(2.0));
treeset.add(new BigDecimal(2.00));
System.out.println("hashset.size(): " + hashset.size()); // 1 -- ** UNEXPECTED **
System.out.println("treeset.size(): " + treeset.size()); // 1
}
}
【问题讨论】:
-
不要使用
new BigDecimal(double)构造函数。请改用带有String参数的那个。请参阅docs.oracle.com/javase/8/docs/api/java/math/… 上的注释
标签: java hashset bigdecimal