Java:不同的double和double相比

前端之家收集整理的这篇文章主要介绍了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直接比较错误.请为我解释.

谢谢 :)

解决方法

c和d在技术上是两个不同的对象,==运算符只比较引用.
c.equals(d)

更好的是比较价值,而不是参考.但仍然不理想.直接比较浮点值应该总是考虑一些误差(ε)(Math.abs(c-d)< epsilon). 注意:

Integer c = 1;
Integer d = 1;

这里的比较会产生真实的,但是这更复杂(整数内部缓存,在JavaDoc of Integer.valueOf()中描述):

This method will always cache values in the range -128 to 127,inclusive,and may cache other values outside of this range.

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

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

也可以看看

> Weird Integer boxing in Java
> How to properly compare two Integers in Java?

猜你在找的Java相关文章