2014-02-05 94 views
3

好吧這麼基本的問題在這裏。不知道爲什麼程序返回一個int

double test = 1/3 * 3.14; 

我知道你需要做(1.0/3)才能得到實際的雙數。但我想知道的是爲什麼。我會認爲,由於你乘以3.14,這將使它成倍增長。

所以我正確地認爲,無論周圍發生了什麼,無論何時在算術方程中使用兩個值,如果它們是整數,那麼您將得到一個整數值?

即。 x/y * z

雖然x除以y就是程序關心的所有內容,並且如果它們都是整數,您將返回一個整數值?只有當你乘以z(3.14)時它變成了雙精度。

+3

這是爲什麼downvoted?我認爲這是一個關於操作優先級的有效問題... – OneChillDude

回答

4

當兩個運算符具有相同的優先級時,評估發生從左到右。 */具有相同的優先級。

1/3 * 3.14首先評估1/3。兩個操作數都是int,第一個操作是整數除法,結果是int

接下來,result * 3.14被評估。一個操作數是int,另一個操作數是double,我們有混合類型。 Java對我們有幫助,並將int轉換爲double以保持準確性。發生浮點除法,結果爲double

+0

好吧,這正是我的想法,但需要清除它以確保。 – Danrex

+0

只是一個挑剔的問題:'3.14'是一個'double'文字,而不是'float'文字。 – rgettman

+0

@rgettman哈哈我新人有人會讓我這一點。在確認你是對的後糾正。 – Rainbolt

2

因爲根據算法規則,首先計算1/3。由於它是2整數,所以它是一個整數除法,結果爲0.之後,您有一個雙重計算,但錯誤已經發生。

0

我的理解是,這與Java中的自動裝箱有關。 Java認爲三分之一除以兩個整數,所以你會得到一個int(被轉換成double)。

如果你做了1/3D,你會得到0.33333333回

+2

你所描述的雖然是正確的,但不是[autoboxing](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – rgettman

+0

謝謝,把它和[java文字後綴](http://www.javaying.com/2006/12/whats-java-literal.html)混淆:) –

相關問題