【问题标题】:BigDecimal 2.0 is coming equal to BigDecimal 2.00 [duplicate]BigDecimal 2.0 即将等于 BigDecimal 2.00 [重复]
【发布时间】: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
    }
}

【问题讨论】:

标签: java hashset bigdecimal


【解决方案1】:

在编译时doubles 2.02.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 false

【讨论】:

  • 谢谢,+1,但这是否意味着在 BigDecimal("2.00") 的情况下,它会尝试将 BigDecimal 与 String 进行比较,而在 BigDecimal(2.00) 的情况下,它会尝试将 BigDecimal 与十进制原语?
  • @pjj 不,双精度文字 2.0 和 2.00 相同的双精度值,因此您创建的 BigDecimal 值具有相同的值。
  • @Elliott:您能否澄清我的上述疑问,以便我接受它作为答案。我知道这可能很愚蠢,但它一直在我脑海中挥之不去。
  • @pjj BigDecimal 中有一个内部的scale 部分,在equals() 方法中检查。当您拥有具有2 规模的数字42 时,该BigDecimal 实例将不同于(根据equals())与具有相同值42 的不同BigDecimal 实例,但具有不同缩放5.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2021-02-13
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多