Java中的`x>0`和`x>0.0D`之间有什么区别吗?
以下代码来自Math.javajava标准库:
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
我有以下问题:
- 代码是否等于
return (a <= 0) ? 0.0D - a : a; - 此外,代码是否等于
return (a <= 0) ? - a : a;
谢谢你的帮助!
回答
a <= 0当a双转换0为double(由于二进制数字提升),这意味着它相当于a <= 0.0D.
a <= 0.0D可能更有效,因为它保存了转换,但如果编译器转换a <= 0为a <= 0.0D以保存该类型转换,我不会感到惊讶。
JLS相关报价:
15.20.1。数值比较运算符 <、<=、> 和 >=
对操作数执行二进制数字提升(第 5.6.2 节)。
5.6.2. 二进制数字提升
如果任一操作数的类型为 double,则另一个将转换为 double。
至于你的第二个问题,使用一元否定运算符的代码不等同于abs方法的代码,因为:
对于浮点值,否定与从零减法不同,因为如果 x 为 +0.0,则 0.0-x 为 +0.0,而 -x 为 -0.0。一元减号只是反转浮点数的符号。
( 15.15.4. 一元减运算符 - )
顺便说一句,正零或负零的情况在该abs方法的Javadoc中被称为特例:
特别案例:
• 如果参数为正零或负零,则结果为正零。
• 如果参数是无穷大,则结果是正无穷大。
• 如果参数为 NaN,则结果为 NaN。
前两个特殊情况是-a与 不同的情况0.0D - a。