2013-05-28 47 views
3

所以在標題: 中被問到在從一個long值中減去double值時內部發生了什麼?是double或long類型的結果,甚至是在Java規範中指定的行爲還是jvm特有的行爲?Java是什麼類型的(long a - double b)

所以我知道我可以測試自己的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

問題:還有什麼結果呢? –

+0

那麼結果可能會很長... – noamik

+0

我猜想,因爲double更具體(當考慮浮點時)比long更長時,該long將在操作之前轉換爲double,因此,結果爲double,edit :通過將double轉換爲long,您將失去所有浮點值,這種轉換將毫無意義 – Smajl

回答

6

這裏是規範的適用部分:

4.2.4。浮點運算

如果操作數的數字運算符中的至少一個是 double類型的,則該操作被執行使用64位浮點 算術,數值的結果運算符的值爲 ,類型爲double。如果另一個操作數不是雙精度型,則首先將其擴展爲 (§5.1.5),以通過數字提升(§5.6)鍵入double。

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

+0

非常感謝,這回答了我的問題。我會盡快接受你的答案...... – noamik

+0

@noamik很高興能幫到你。你看起來很像我,不要告訴我它做了什麼,告訴我爲什麼這樣做。 –

4
  1. 由於a是一個長期的和bdoublea - b產生doubleFloating-Point Operations)。

    如果數值運算符的至少一個操作數是double類型的,那麼操作使用64位浮點算法執行,並且數值運算符的結果是double類型的值。如果另一個操作數不是雙精度型,則首先將其擴展(第5.1.5節),以便通過數字提升(第5.6節)鍵入double。

  2. double的結果然後autoboxed鍵入DoubleBoxing Conversion)。

+0

嗯,我知道我的jvm是這樣做的。但問題更多:它爲什麼這樣做?請不要用技術推理來回應,因爲我自己也可以這樣做。我想要的是指向規範的指針,指定如何在這種情況下投射,或者(證實)聲明決定如何行動留給jvm實現。 – noamik

+0

@noamik添加了Java®語言規範的鏈接。 –

+0

非常感謝您的幫助! – noamik

0

我想說,如果公式中有一個double,那麼如果沒有強制轉換,結果必然是double(或者至少是一個浮點數)。

這和(10/3)是一樣的,(10.0/3)不會。

0

是的,其實輸出類型將永遠是你的opperation左邊變量的類型。您的編譯器將嘗試轉換或轉換您的正確參數。如果可能的話,它會編譯,如果沒有,你將有一個編譯錯誤。

+0

左邊的變量在這種情況下很長,所以看起來並不是這樣。 –

1

這裏有一些事情正在進行。 a-b操作產生了雙重效果 - 這就是擴大原始圖形以適應信息丟失。

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

然後被分配結果到對象引用(對象C = A - B),其產生原始雙到雙精度對象的自動裝箱。

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

+0

非常感謝您的指點。自從他第一次接受凱文的回答後,我接受了。 – noamik

相關問題