2016-10-06 148 views
2

下面的簡單浮點算術運算未按預期工作。浮點算術運算不如預期

double den = (1+j); 
System.out.println(den); 
den = 1/den; 
System.out.println(den); 

double newden = 1/(1+j); 
System.out.println(newden); 

上面的代碼給出了以下輸出。

7.0
0.14285714285714285
0.0

如上所示,第一兩個操作按預期工作但最後沒有。我想這與變量類型有關,但還沒有找出問題所在。

您能解釋一下Java中算術運算的行爲嗎?

+2

'1 /(1 + j)的'是'int'計算和將留下一個'int'結果,而'1/den'是一個'double'計算(因爲'den'是一個'double'',這會給你一個'double'。 (只是猜測'j' beeing一個'int',因爲它不可見它代表的是什麼) – SomeJavaGuy

+0

我猜j是一個整型變量。所以整個表達式'1 /(1 + j)'也被認爲是一個整數。你可以用'j'來加倍以得到預期的結果。 'newden = 1 /(1 +((double)j)' – kaetzacoatl

+0

ahhh得到它'j'只是一個計數器。但是如果我聲明一個double,爲什麼'1 /(1 + j)'是一個整數計算? – user3540466

回答

8

Java中的運算在int做,如果沒有涉及float/double/long。因此,將其中一個arg更改爲float/double,並且按預期工作。

下面的代碼將工作:

double newden = 1d/(i+j); 
System.out.println(newden); 

java spec

加寬原語轉換(§5.1.2)被施加到任何一個或 兩個操作數轉換爲規定的按以下規則排序:

  • 如果任一操作數是double類型,則另一個操作數轉換爲double。
  • 否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。
  • 否則,如果任一操作數的類型爲long,則另一個操作數轉換爲long。
  • 否則,兩個操作數都轉換爲int類型。
+3

爲什麼使用浮動當你想要一個雙?你可以簡單地使用'1d /(1 + j)' – kaetzacoatl

+0

@kaetzacoatl改變 –

+0

小修正:「如果沒有float/double參數,java中的算術運算是用int來完成的」 - AND不是'long'。這個語句非常準確,因爲每個類型的<'int'都被提升爲int。即使'byte + byte'也會產生一個'int'。 – Turing85

3

這是工作。如果你嘗試這種通過把(double) 1/(1+j);那裏,你可以看到的結果是:

int j = 1; 
     double den = (1+j); 
     System.out.println(den); 
     den = 1/den; 
     System.out.println(den); 

     double newden = (double) 1/(1+j); 
     System.out.println(newden); 

這裏, 您的輸出將是:

2.0 
0.5 
0.5