加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java:不同的double和double相比

发布时间:2020-12-14 05:14:43 所属栏目:Java 来源:网络整理
导读:我知道Double是一个包装类,它包含双数.今天我又看到另一个主要区别: double a = 1.0;double b = 1.0;Double c = 1.0;Double d = 1.0;System.out.println(a == b); // trueSystem.out.println(c == d); // false 我很奇怪! 所以,如果我们使用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?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读