我知道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?