2017-04-06 42 views
-4
int f=1; //this is to store factorial value 
double s=1; 
for(int i=1;i<=10;i++){ 
    f=f*i; //Even though i is int,changing f from int value to double value brigs a difference 
    s=s+(double)(1/f); 
} 
System.out.println(s); 

我必須找到一個數的階乘。我發現在上面的代碼中,如果我將f從int更改爲double,我的答案是十進制值,但如果我使用int,我的答案不會達到小數。 像在int -2.0的情況下雙-2.718281那樣f只是乘以int的值,小數值從哪裏來?如果我將int從int更改爲double,下面代碼的輸出如何更改?

+0

不確定的問題是。你輸出的不是f。並且你正在輸出循環。請解釋你期望用s看到什麼。 –

回答

0

那東陽如果˚F,從它的操作結果與小號(s = s + 1/f;)將返回一個值,並且如果其一個INT它將返回它的int值(截斷)。

看看這個docs

+2

實際上,'int'結果是*截斷*,不是四捨五入。即'2/3 == 0' – Bohemian

+0

但是,如果我是int,那意味着所有f得到的是 - 1,2,3,4,5,6 –

+0

感謝@Bohemian的評論 –

0

因爲1/f始終爲0,除了在第一種情況。

把另外的System.out裏面你:

 int f=1; //this is to store factorial value 
    double s=1; 
    for(int i=1;i<=10;i++){ 
     f=f*i; //Even though i is int,changing f from int value to double value brigs a difference 
     System.out.println(1/f); 

     s=s+(double)(1/f); 
    } 
    System.out.println(s); 

如果您在雙重價值的所有1/f改變f應該回到沒有截斷它真正的雙重價值。

0

美中不足的在於這個表達式: -

s=s+(double)(1/f); 

這裏,當fdouble1/f返回一個double值。當fint時,值1/f也是int對於實施例: -

1/2.0 -> gives 0.5 
1/2 -> gives 0 
0

在Java中結果爲雙如果在 - 至少一個的分子和分母中是一個雙。在這種情況下,分子(1)是一個int,因此如果f是一個int,那麼1/f將是一個int,如果f是一個double,則1/f將是一個double。

如果f是一個int:

迭代1亦即,i = 1

s=s+double(1/f) will be s=1.0+double(1/1) -> s=1.0+double(1) -> s=1+1.0 -> s->2.0

用於迭代2亦即,i = 2,現在S = 2。0

s=s+double(1/f) will be s=2.0+double(1/2)

1/2 = 0,因爲由INT INT劃分將是一個int

s=2.0+double(0)

現在整數0類型強制轉換爲加倍。因此,它成爲

s=2.0+0.0 -> s=2.0

同樣出現這種情況對於所有剩餘的迭代。的1/f總是爲零當f是一個int大於1

更大如果f是一個雙

迭代1亦即,i = 1

s=s+double(1/f) will be s=1.0+double(1/1.0) -> s=1.0+double(1.0) -> s=1.0+1.0 -> s->2.0

這裏類型轉換雙不需要的,因爲INT /在Java雙已經導致雙

用於迭代2亦即,i = 1,現在S = 2.0

s=s+double(1/f) will be s=2.0+double(1/2.0)

1/2 = 0.5,因爲由INT雙劃分將是一個雙和十進制不丟失

-> s=2.0+double(0.5) -> s=2.5

同樣類型轉換到加倍是不必要的。

類似地,當使用double時,小數部分在所有其他迭代中不會丟失。

因此,你看到當f是浮動的差,並且f是一個int

0

在INT (1/F)返回僅商一部分的情況下,但在雙重的情況下,它會返回一個十進制值。例如,如果的˚F值爲2

在INT(1/2)的情況下,會給0

在雙(1/2.0)的情況下將得到0.5。