2013-10-21 30 views
2

我在Java中自學成才的初學者,在同一方程解釋「積累的舍入誤差」雙值

例如使用時無法理解整數和雙打,

int x; 
double x; 
i = 5; 

x = i/2 + 1.0; // (answer 3.0) 

z = (int) 1.0 + i/2.0; // (answer 3.5) 

什麼是四捨五入?

+0

除了答案,'z =(int)1.0 + i/2.0'不會做你的想法。它相當於'z =((int)1.0)+ i/2.0',其中'1.0'被轉換爲'1',然後被提升爲'1.0'。 –

回答

6

的問題是,這種操作:

i/2 

...正在執行整數除法。這就是爲什麼5/2結果爲2,而不是2.5。這是在Java中正常的行爲,執行浮點除法,你必須確保操作數的至少一個是浮點文字:

5/2.0 

現在上面會返回2.5,符合市場預期。或者,您可以選擇其中一個操作數:

((double) i)/2 
0

一個涉及兩個整數的除法將產生一個整數(因此,5/2 = 2)。如果在其中一個操作數中使用雙精度型,則會產生雙精度(因此5/2.0 = 2.5)。其餘的是操作優先。

0

i/2 = int 2因爲兩個操作數是整數,並且因此使用整數除法運算(產生整數結果)

i/2.0 = double 2.5因爲i被第一強制轉換爲加倍(類型另一個操作數)和雙師使用

0

這是整數和十進制除法之間的情況。

當兩個整數分開時,執行整數除法,即數字被分割並且小數部分被截斷。

當兩個數字中的任何一個數字都是小數(雙/浮點數)時,每隔一個數字將被視爲一個小數,因此給定表達式5/2.0。在任何類型的對象2.0(默認爲double)下,結果都將返回2.5。

給定混合方程如5/2 + 1.0,運算符優先級定義應如何評估表達式。由於除法的優先級高於加法,因此5/2會被視爲整數除法,返回2作爲整數。

然後將其添加到1.0,其中2在評估前被提升爲雙倍數,返回數字3.0作爲最終結果的雙倍數。