Java BigDecimal equals()与compareTo()的比较
考虑一下简单的测试类:Java BigDecimal equals()与compareTo()的比较,java,equals,bigdecimal,compareto,Java,Equals,Bigdecimal,Compareto,考虑一下简单的测试类: import java.math.BigDecimal; /** * @author The Elite Gentleman * */ public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub BigDecimal x =
import java.math.BigDecimal;
/**
* @author The Elite Gentleman
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal x = new BigDecimal("1");
BigDecimal y = new BigDecimal("1.00");
System.out.println(x.equals(y));
System.out.println(x.compareTo(y) == 0 ? "true": "false");
}
}
您可以(有意识地)说x
等于y
(不是对象引用),但当您运行程序时,以下结果显示:
false
true
问题:BigDecimal
中的compareTo()
和equals()
之间有什么区别,compareTo
可以确定x
等于y
PS:我看到BigDecimal在equals()
方法上有一个inflate()
方法。充气()
实际上做什么?答案是:
与此不同,此方法仅当两个BigDecimal
对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00)
换句话说:equals()
检查BigDecimal
对象在每个方面是否完全相同compareTo()
“仅”比较它们的数值
至于为什么equals()
会有这种行为,我们已经回答了这个问题
我看到BigDecimal在equals()方法上有一个inflate()方法。充气()实际上做什么
基本上,
inflate()
会在必要时调用biginger.valueOf(intCompact)
,也就是说,它会从long intCompact
中创建存储为biginger
的无标度值。如果您不需要该biginger
,并且未标度的值适合long
BigDecimal
似乎试图尽可能长地节省空间。您也可以与double value进行比较
BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());
我相信正确的答案是使两个数字(大小数)具有相同的比例,然后我们可以决定它们是否相等。例如,这两个数字相等吗
1.00001 and 1.00002
嗯,这取决于规模。在5级(5个小数点)上,不,它们是不一样的。但在较小的小数精度(4级及以下)上,它们被认为是相等的。
因此,我建议将两个数字的比例相等,然后进行比较。如果您不仔细阅读JavaDoc,这是
BigDecimal
中一个非常棘手的部分我们从中发现了一些奇怪的bug,直到我们意识到了它们的区别。标准API的许多部分都是“不直观”的,而直观的东西是不正确的BigDecimal
就是这样一种东西。因此,应该始终检查JavaDoc。至少有一次你发现有什么奇怪的事情发生了。在阅读了你的答案后,我刚刚检查了Comparable,它指出与equals一致“是强烈建议(但不是必需的)”我问了为什么:@StephenC我认为这种不一致的存在是不正确的。我不知道你写了什么(特别是最后一句话).@最后一句话应该是这样的:BigDecimal
内部将其未标度值保持在long
以及biginger
中。如果内部不需要BigInteger
,则不会创建它,但如果需要(例如equals
遇到膨胀和非膨胀的BigDecimal)
inflate()`则用于创建它。-总而言之:inflate()
在必要时处理内部转换,因为它是私有的,所以对类的用户不重要。Adinflate()
:它不是公共API的一部分,因为它只处理内部表示,对“外部”没有可见的影响。因此,除非您真的想深入研究BigDecimal
的实现,否则我建议您忽略此方法。可以找到简短的解释和源代码片段,请尽量避免使用此解决方案。即使是双打也应该与“epsilon”相比较。使用BigDecimal并将其作为double进行比较是没有意义的。很有可能你会射伤自己的腿。必须使用epsillon来比较双倍值