首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigDecimal 2.0将与BigDecimal 2.00相同

BigDecimal 2.0将与BigDecimal 2.00相同
EN

Stack Overflow用户
提问于 2022-01-23 14:59:14
回答 1查看 236关注 0票数 1

我读了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。请参见下面的代码,如果有人能指出我是否遗漏了什么?

代码语言:javascript
复制
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
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-01-23 15:04:23

在编译时,double2.02.00是相同的。你需要一个String。喜欢,

代码语言:javascript
复制
System.out.println(new BigDecimal(2.0).equals(new BigDecimal("2.00")));

输出

代码语言:javascript
复制
false

当前的代码相当于

代码语言:javascript
复制
System.out.println(2 == 2.00);

这显然是true

要在最后一个示例中进行扩展,请考虑

代码语言:javascript
复制
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));

这应该可以解释为什么当前代码的行为是这样的;因为

代码语言:javascript
复制
2 equals 2.00 is false
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70823343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档