使用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没有对它说一句话,因此我的问题。
答案 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
此致