我最近在BigDecimal
中遇到了一个我以前没有注意到的行为。我一直使用它们作为在精度很重要的领域加倍的替代方案。例如在财务计算中。
然而,我最近发现了一个事实
new BigDecimal("1.0").equals(new BigDecimal("1")) == false
我不得不承认我对此感到惊讶。我想这是因为第一个刻度为1,而第二个刻度为0,但这似乎还是违背了直觉。我想我以前从未遇到过它的原因是因为我们一直使用固定比例bigdecimals
进行财务计算。
检查BigDecimal
文档,我可以看到,应该使用compareto()==0
来检查相等性,忽略小数位数,而equals()
同时比较值和小数位数。
在使用不同刻度的BigDecimal
s时,是否还有其他类似的问题需要注意?
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