正如标题中所述: 在从长值中减去double值时,内部会发生什么?类型为double或long的结果是否甚至在Java规范中指定了这种行为,或者这种行为是否特定于jvm?
所以我知道我可以测试自己jvm的作用:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
double b = 1000;
long a = 1000;
Object c = a - b;
Class cls = c.getClass();
System.out.println("The type of the object is: " + cls.getName());
}
}
输出:
The type of the object is: java.lang.Double
但这是在某处指定的吗?或者它是否特定于我使用的jvm?
答案 0 :(得分:6)
以下是规范的适用部分:
<强> 4.2.4。浮点运算
如果数值运算符的至少一个操作数是类型的 double,然后使用64位浮点执行操作 算术,并且数值运算符的结果是值 双打。如果另一个操作数不是double,则首先加宽 (§5.1.5)通过数字提升键入double(§5.6)。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4
答案 1 :(得分:4)
由于a
很长而b
是double
a - b
会产生double
(Floating-Point Operations)。
如果数值运算符的至少一个操作数是double类型,则使用64位浮点运算执行运算,并且数值运算符的结果是double类型的值。如果另一个操作数不是double,则首先将其扩展(第5.1.5节)以通过数字提升键入double(第5.6节)。
然后double
结果会自动设置为Double
(Boxing Conversion)。
答案 2 :(得分:1)
这里有几件事情要发生。 a-b操作产生一个双 - 这是原语的扩展,以适应信息的丢失。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1
然后,您将结果分配给Object引用(Object c = a - b;),它会生成double对象的自动装箱。
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
答案 3 :(得分:0)
我会说,如果公式中有一个double,如果没有强制转换,结果必然是double(或至少是一个浮点数)。
与(10/3)相同的是int而(10.0 / 3)不会。
答案 4 :(得分:0)