Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal equals()与compareTo()的比较_Java_Equals_Bigdecimal_Compareto - Fatal编程技术网

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()
在必要时处理内部转换,因为它是私有的,所以对类的用户不重要。Ad
inflate()
:它不是公共API的一部分,因为它只处理内部表示,对“外部”没有可见的影响。因此,除非您真的想深入研究
BigDecimal
的实现,否则我建议您忽略此方法。可以找到简短的解释和源代码片段,请尽量避免使用此解决方案。即使是双打也应该与“epsilon”相比较。使用BigDecimal并将其作为double进行比较是没有意义的。很有可能你会射伤自己的腿。必须使用epsillon来比较双倍值