2011-04-04 61 views
3

下面的代碼:這個部門有什麼問題?

class testsum 
{ 
    public static void main(String arg[]) 
    { 
     double sum=0; 
     double fraction; 
     fraction=-1/9; 
     System.out.println("fraction: "+fraction); 
     fraction=-1; 
     fraction=fraction/9; 
     System.out.println("fraction: "+fraction); 
    } 
} 

輸出爲0,然後-0.11111111

爲什麼是第一個輸出0而不是-0.11111111111

+0

哥們......這個問題已經4歲了。 – David 2015-05-18 15:58:40

回答

8

它在第一個例子中做整數除法,因爲這是數字文字的默認類型。嘗試將其更改爲-1.0/9(或1d/9d - d後綴表示double),您應該得到相同的答案。

+0

所以它會進行整數除法,即使該值將存儲在類型爲double的變量中? – David 2011-04-04 20:03:15

+1

該分裂發生之前,它知道這將是一個雙。它以整數進行分割,然後意識到它必須轉換爲雙精度。自從時代以來,這一直是許多錯誤的來源。 – corsiKa 2011-04-04 20:04:06

+0

是的,它沒有考慮到(正確或錯誤!) – 2011-04-04 20:04:08

2

1和9都是整數。嘗試

1.0/9 

這就是爲什麼它適用於fraction/9,因爲fraction是雙。

0

嘗試在括號中包裝「-1/9」。

0

第一個是0,因爲它在做整數除法。 -1和9以及整數,當分成等於0.結果然後轉換成雙精度值,因此它可以存儲在fraction中。最簡單的方法是這樣的:

fraction = -1.0/9; 
1

當你做-1/9,它說「-1,這是一個int 9,這是一個int -1/9整除是0。呵呵,現在。我需要加倍。「

將其更改爲-1.0/9應解決該問題。

0

由於-19是整數,所以-1/9是一個整數除法(其結果0,這轉換爲加倍是0.0時)。

要做一個浮點數除法,你應該將其中一個數字轉換爲雙精度,即(double) 9,9d或簡單的9.0

在後一種情況下,fraction已經是雙倍(-1.0),所以fraction/9是浮點除法。