当前位置: 首页 > 面试题库 >

Double与Double之间的差异比较

孔弘盛
2023-03-14
问题内容

我知道这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直接将比较做错了。请为我解释。


问题答案:

cd在技术上两个不同的对象和==运营商只比较引用。

c.equals(d)

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

注意:

Integer c = 1;
Integer d = 1;

这里的比较会产生true,但是比较复杂(Integer内部缓存,在JavaDoc中有Integer.valueOf()描述):

此方法将始终缓存-128至127(包括)范围内的值,并且可能缓存该范围之外的其他值。

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

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


 类似资料:
  • 问题内容: 我进行了一个junit测试,使用以下命令声明了两个Double对象: 很好,然后我决定将其更改为使用原始double,除非您也提供了增量,否则该结果被弃用了。 所以我想知道在assertEquals中使用Double对象还是原始类型有什么区别?为什么不使用不带增量的对象,但不推荐使用不带增量的基元呢?Java是否在后台执行了已经考虑了默认增量值的操作? 谢谢。 问题答案: 没有断言方法

  • 在swift中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?

  • 问题内容: 我有一个双重数组。我尝试了如下操作 它不打印任何内容。然后我把它做成一个双数组 它打印。 有人可以解释为什么存在这种差异吗? 问题答案: 您的第一个调用实际上是返回-将参数自动装箱,因为a 不是…。泛型不允许将基本类型用作类型参数。 如果您要将a 转换为,则需要手动执行,或使用第三方库来执行。例如: 请注意,与数组的任何后续更改不同,它 不会 反映在列表中,反之亦然-它是副本,而不是视

  • 在阅读了这个问题和这个msdn博客之后,我尝试了几个例子来测试这个: 是的,预期输出为假。因此,我尝试将表达式的两侧强制转换为double和float,以查看是否可以得到不同的结果: 第一行输出但第二行输出,为什么会发生这种情况? 此外 即使没有铸造,上面的两行都给出了。和... 这一行输出。如果它们都被浮点数减去,如何从减去18.01中减去8的差异? 我试图通读博客并提出问题,但似乎在其他地方找

  • 描述 (Description) C库函数double fmod(double x, double y)返回x的余数除以y 。 声明 (Declaration) 以下是fmod()函数的声明。 double fmod(double x, double y) 参数 (Parameters) x - 这是具有除法分子iex的浮点值 y - 这是具有除法分母iey的浮点值 返回值 (Return Va

  • 描述 (Description) C库函数double pow(double x, double y)将x提升为y的幂,即x y 。 声明 (Declaration) 以下是pow()函数的声明。 double pow(double x, double y) 参数 (Parameters) x - 这是浮点基值。 y - 这是浮点功率值。 返回值 (Return Value) 此函数返回将x提升