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

是否有其他类似于BigDecimal(“1.0”).equals(新的BigDecimal(“1”)返回false的问题?

太叔京
2023-03-14

我最近在BigDecimal中遇到了一个我以前没有注意到的行为。我一直使用它们作为在精度很重要的领域加倍的替代方案。例如在财务计算中。

然而,我最近发现了一个事实

new BigDecimal("1.0").equals(new BigDecimal("1")) == false

我不得不承认我对此感到惊讶。我想这是因为第一个刻度为1,而第二个刻度为0,但这似乎还是违背了直觉。我想我以前从未遇到过它的原因是因为我们一直使用固定比例bigdecimals进行财务计算。

检查BigDecimal文档,我可以看到,应该使用compareto()==0来检查相等性,忽略小数位数,而equals()同时比较值和小数位数。

在使用不同刻度的BigDecimals时,是否还有其他类似的问题需要注意?

共有1个答案

危卜鹰
2023-03-14

BigDecimal有一个值和一个刻度。两者都需要相等才能使大小数相等。来自java文档。...

与compareTo不同,此方法仅在两个BigDecimal对象的值和尺度相等时才认为它们相等(因此,用此方法进行比较时,2.0不等于2.00)。

https://docs.oracle.com/javase/7/docs/api/java/math/bigdecimal.html#equals(java.lang.object)

 类似资料:
  • 问题内容: 为什么此代码有时返回1E + 1,而对于其他输入(例如17)却没有以科学计数法打印输出? 问题答案: 使用bigDecimal.toPlainString(): 输出:

  • 问题内容: 如果值大于零,如何比较? 问题答案: 就像这样简单: 的文档实际上指定了它将返回-1、0或1,但是更通用的方法仅保证在适当的三种情况下小于零,零或大于零- 因此,我通常只是坚持这种比较。

  • 我读到BigDecimal.equals的Java博士说: 将此BigDecimal与指定的对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00)。 但是当我测试它时,不知何故,我得到了意想不到的结果,并且等于。我认为出于同样的原因,当我把和放在中时,大小为1,而我期望大小为2。请看下面的

  • 问题内容: 是否有Java中BigDecimal上的平方根库? 问题答案: JSciencev4.3.1的类似乎等效,并且可能会对您有所帮助。用法示例: 编辑 :更新了代码和链接以反映当时的当前版本(v4.3.1)。基于@ile和@Tomasz评论,谢谢。

  • 我正在这样做: 我得到了这个错误: java.lang.算术异常:非终止小数展开;没有精确可表示的小数结果。 我需要把setScale放在哪里? 谢谢

  • 我正在尝试使用equals方法与对象进行比较,但它总是返回false