我读了Java of BigDecimal.equals()说
将此BigDecimal与指定的对象进行相等比较。与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
}
}发布于 2022-01-23 15:04:23
在编译时,double的2.0和2.00是相同的。你需要一个String。喜欢,
System.out.println(new BigDecimal(2.0).equals(new BigDecimal("2.00")));输出
false当前的代码相当于
System.out.println(2 == 2.00);这显然是true。
要在最后一个示例中进行扩展,请考虑
BigDecimal a = new BigDecimal(2.0);
BigDecimal b = a.setScale(2);
System.out.printf("%s equals %s is %s%n", a, b, a.equals(b));这应该可以解释为什么当前代码的行为是这样的;因为
2 equals 2.00 is falsehttps://stackoverflow.com/questions/70823343
复制相似问题