使用>是否安全和<运算符与Double

时间:2017-06-21 12:18:21

标签: java double

使用Java中的Double wrapper类直接使用以下比较运算符是否安全并被视为一种良好做法:> < &lt ; = > =

我已经尝试了它似乎工作,如下面的代码:

Double tiny = 1.2;
Double big = 125.65;

System.out.println(tiny > big); 
System.out.println(tiny >= big);
System.out.println(tiny < big); 
System.out.println(tiny <= big); 

生成此输出:

false
false
true
true

然而,据我所知,Java不支持运算符重载,official documention没有对它说一句话,因此我的问题。

4 个答案:

答案 0 :(得分:2)

来自the language spec(我自己强调):

  

15.20.1。数值比较运算符&lt;,&lt; =,&gt;和&gt; =

     

数值比较运算符的每个操作数的类型必须是可转换(第5.1.8节)到基本数字类型的类型,否则会发生编译时错误。

     

对操作数执行二进制数字提升(第5.6.2节)。

     

请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。

Sec 5.1.8也说:

  

如果类型是数字类型(§4.2),,或者它是可以通过取消装箱转换转换为数字类型的引用类型,则称该类型可转换为数字类型。

所以是的,使用带有数值比较运算符的包装基元是很好的;他们先取消装箱。

答案 1 :(得分:2)

与直接使用double值的运算符一样“安全”。

编译器会根据需要将Double变为double(反之亦然);正如安迪所描述的那样答案。

一个要注意的事情:(联合国)拳击来免费。因此,假设您正在进行大规模计算,您需要密切关注 not 意外使用Double个对象。因为恒定(非)拳击可以变成一个非常真实的性能问题。

确切地说:拆箱是一种相当便宜的操作;拳击不是。

答案 2 :(得分:1)

如果您的问题范围内的值不同,您就可以了。但是如果值较小,则可能会出现舍入问题的问题:

System.out.println(0.3d * 3 == 0.9d); // -> false

因此,您可以编写一些自己的方法来检查差异是否在指定的增量中(仅适用于==

private boolean nearlyEqual(Double d1, Double d2, double delta) {
    if (d1 == null || d2 == null)
        return d1 == d2; // true if both null or return false (as specified)
    return Math.abs(d1 - d2) <= delta;
}

答案 3 :(得分:0)

在这种情况下,Java编译器将执行一个名为unboxing的操作,这意味着它会将Double对象类转换为基本类型:

https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

此致