当前位置: 首页 > 知识库问答 >
问题:

BigDecimal 2.0等于BigDecimal 2.00

戈建白
2023-03-14

我读到BigDecimal.equals的Java博士说:

将此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
    }
}

共有1个答案

晏富
2023-03-14

在编译时,doubles2.02.00是相同的。您需要一个字符串。喜欢

System.out.println(new BigDecimal(2.0).equals(new BigDecimal("2.00")));

输出

false

您当前的代码相当于

System.out.println(2 == 2.00);

这显然是正确的。

要扩展最后一个例子,请考虑

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
 类似资料:
  • 问题内容: 我正在从xml配置转移到注释。我想转换一个会话范围的bean是 可以通过注释完成此操作吗?如果没有,我该怎么做才能使该声明继续工作? 问题答案: 在spring上下文xml中,执行以下操作: 请注意,尽管如此,你将需要为该包中的所有类编写接口。

  • 问题内容: 我在PostgreSQL中有一个名为的关系,该关系包含2个字段:和,我想找到具有最高值的产品。据我所知,有两种方法可以做到: 或者 他们的执行速度有什么不同吗? 问题答案: 如果有任何行,第一个查询将失败(如Gordon所示)。 仅当所有行都具有时,第二个查询才会失败。因此,它在大多数情况下应该是可用的。(而且速度更快。) 如果在 Postgres 12或更早版本中 需要NULL安全查

  • 今天我注意到这个node.js代码: 给出输出 这很奇怪;如果某物不等于0或大于0,那么它为什么大于或等于0呢?发生什么事了?

  • 标题说明了一切。我的问题是关于不同的字符串等价方法的效率。我经常使用<代码>。equalsIgnoreCase(String str),因为我对它很有兴趣。但我开始怀疑这是否是寻找字符串之间等价性的最有效方法。在我看来,正在调用一种大小写转换方法或,然后在其定义中调用,但我可能错了。那么,以下哪种方法在以下情况或任何情况下更有效?

  • 我目前正在Codecademy上学习JavaScript,我遇到了一些问题。我在一个叫做“建造石头,布,剪刀”的部分,有一个部分有一个条件,如果数学。random()大于0.33小于0.66,计算机将选择纸张。我的问题是,如何建立一个if条件,即某个东西大于X,但同时小于Y?

  • 本文向大家介绍1in等于多少mm?1mm等于多少px?相关面试题,主要包含被问及1in等于多少mm?1mm等于多少px?时的应答技巧和注意事项,需要的朋友参考一下 1in == 96px 1mm == 0.1cm == 3.78px 1in == 96/3.78 mm

  • 问题内容: 我是一名普通的C#开发人员,但有时我会使用Java开发应用程序。我想知道是否有Java等效于C#async / await?简单来说,java相当于什么: 问题答案: 不,在Java中-甚至在v5之前的C#中,都没有等效的异步/等待方式。 在后台构建状态机是一项相当复杂的语言功能。 Java中对异步/并发的 语言 支持相对较少,但是该软件包包含许多与此相关的有用 类 。(不完全等同于任

  • 问题内容: 我正在努力寻找一种方法,以根据谓词在流的开头跳过某些元素。 像这样: 那相当于Scala 。 问题答案: 这种操作不是s 的预期用例,因为它并入了元素之间的依赖关系。因此,该解决方案可能看起来不太好,因为您必须为谓词引入一个全状态变量: 请注意,与您的示例相比,该条件必须颠倒。 当然,您可以在方法中隐藏令人讨厌的细节: 一个更复杂,但更清洁,可能更有效的方法是深入研究金属,即界面: 可