Java:比较不同的double和Double

时间:2012-09-01 09:58:13

标签: java double

我知道Double是一个包装类,它包含double个数字。今天,我看到了另一个主要区别:

double a = 1.0;
double b = 1.0;
Double c = 1.0;
Double d = 1.0;
System.out.println(a == b);  // true
System.out.println(c == d);  // false

对我这么奇怪!!!

所以,如果我们每次都使用Double,我们必须这样做:

private static final double delta = 0.0001;
System.out.println(Math.abs(c-d) < delta); 

我无法解释为什么Double直接比较错误。请解释一下。

谢谢:)

5 个答案:

答案 0 :(得分:24)

cd在技术上是两个不同的对象,==运算符仅比较引用。

c.equals(d)

更好,因为它比较值而不是引用。但仍然不理想。直接比较浮点值应始终考虑一些错误(epsilon)(Math.abs(c - d) < epsilon)。

请注意:

Integer c = 1;
Integer d = 1;

此处比较会产生true,但这更复杂(Integer内部缓存,在JavaDoc of Integer.valueOf()中描述):

  

此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。

为什么valueOf()?因为此方法隐式用于实现自动装箱:

Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);

另见

答案 1 :(得分:4)

当应用于类类型的表达式时,==始终执行参考比较(JLS section 15.21.3)。所以这一行:

System.out.println(c == d); 

正在检查cd是否引用相同的对象。 Java中的自动装箱总是(我相信)为floatdouble创建一个新对象(对于整数类型 1 ,情况更复杂)。因此cd引用不同的对象,因此会打印false

如果要比较对象是否相等,则需要明确调用equals

System.out.println(c.equals(d));

使用double,它使用数字相等 - 如section 15.21.1中所指定。因此行为上的差异。


1 对于整体自动装箱,“小”值被缓存 - 因此自动装箱5(比如说)每次都会返回相同的参考值。 “小”的定义是特定于实现的,但它保证在-128到127的范围内。有关详细信息,请参阅section 5.1.7的底部。

答案 2 :(得分:3)

使用equals()检查2个对象的相等性。 ==检查2个引用是否引用内存中的同一对象。

答案 3 :(得分:2)

内容检查仅在检查基元类型时==可靠。对于对象类型,最好使用equals方法:

c.equals(d)

答案 4 :(得分:0)

==equals之间的差异

在原始数据类型上使用==与在对象引用数据类型上使用它不同。

  1. 在原始数据类型上,==被用作equals
  2. 对于对象引用数据类型==引用它们的引用。从而 对象指向内存中的内容。

考虑案例1

    double d1 = 10.00;
    double d2 =10.00;
    System.out.println(d1 == d2); 

*输出为* {true

enter image description here

情况2:==个参考数据类型

    Double d1 = 10.00;
    Double d2 =10.00;
    System.out.println(d1 == d2);

*输出为* {false

enter image description here

d1和d2具有不同的内存引用。

要检查其有效性,请考虑以下代码

    Double d1 = 10.00;
    Double d2 = d1;
    System.out.println(d1 == d2);

由于d1和d2指向相同的内存引用,因此将打印true

因此

Java使用==比较基元,并检查两个变量是否引用相同的 object < / p>

“等于”

用于检查两个objects是否等效。

它还取决于被调用对象的实现。对于Stringsequals()检查其中的字符。

    Double d1 = 10.00;
    Double d2 = 10.00;
    System.out.println(d1.equals(d2));

打印true,因为它看起来在d1和d2内部。

情况1 将不会编译

enter image description here