3

所以正如标题中所问的:当从 long 值中减去 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?

4

5 回答 5

6

这是规范的适用部分:

4.2.4. 浮点运算

如果数值运算符的至少一个操作数是 double 类型,则使用 64 位浮点运算执行运算,数值运算符的结果是 double 类型的值。如果另一个操作数不是双精度数,则首先将其扩展(第 5.1.5 节)以通过数字提升(第 5.6 节)键入双精度数。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4

于 2013-05-28T09:05:40.363 回答
4
  1. 因为ais a long 并且bis adouble a - b产生double( Floating-Point Operations )。

    如果数值运算符的至少一个操作数是 double 类型,则使用 64 位浮点运算执行运算,数值运算符的结果是 double 类型的值。如果另一个操作数不是双精度数,则首先将其扩展(第 5.1.5 节)以通过数字提升(第 5.6 节)键入双精度数。

  2. 然后将double结果自动装箱以输入Double装箱转换)。

于 2013-05-28T09:03:31.433 回答
1

这里发生了几件事。a - b 操作产生一个 double - 这是扩大原语以适应信息丢失。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1

然后,您将结果分配给对象引用 (Object c = a - b;),该引用会生成原始 double 到 Double 对象的自动装箱。

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

于 2013-05-28T09:11:35.713 回答
0

我会说,鉴于公式中有一个双精度数,如果没有强制转换,结果必然是双精度数(或至少是一个浮点数)。

这与 (10 / 3) 将是一个 int 而 (10.0 / 3) 不会是相同的。

于 2013-05-28T09:03:35.340 回答
0

是的,实际上输出类型将始终是您操作的左变量的类型。您的编译器将尝试转换或转换您的正确参数。如果可能,它将编译,否则将出现编译错误。

于 2013-05-28T09:07:32.483 回答