2017-07-14 78 views
1
public class sample { 

public static void main (String[] args) throws java.lang.Exception 
{ 
    int x; 
    x= (int) (2*3.3/1.1); 
    System.out.println(x); 
} 
} 

我找不出爲什麼輸出是5而不是6。如果我們將值更改爲2.2,4.4它給出了期望的值4和8。只有3.3的情況下輸出不匹配。Java分部沒有給出預期的結果

您的幫助將得到高度讚賞在6.6這是一個雙 當您通過1.1除以它會導致浮動

+2

可能是因爲'2 * 3.3/1.1'導致像'5.999'和鑄造爲int的結果'5' – danielspaniol

+1

3.3/1.1 => 2.9999999999999996 – mishadoff

回答

1

2分* 3.3的結果。

精度的差異意味着你得到5.9999 ....當你轉換爲int的小數位得到剁掉你留下5

+2

「6.6這是一個雙倍當你除以1.1它導致浮動」。不,它仍然是一倍。 –

-1

這是因爲當你把3.3 1.1,它導致2.9999999999999996。所以當它乘以2時,它會給出5.999999999999999的輸出。然後你將這個結果轉換爲int,意味着它將會在小數點前面產生數字。所以,你的結果是5

+0

'2 * 3.3/1.1'意思是'(2 * 3.3)/ 1.1',它是'6.6/1.1'。 –

+0

如果用1.1除以6.6,結果是5.999999999999999。 – Zameer

0

我無法找出原因輸出爲5,而不是6

這是因爲6.61.1都是double值,所以6.6/1.1劃分結果是5.9999999999999在這裏,因爲在電腦上,這個部門是近似的,因爲你無法做無限精確的劃分。

當你cast a double to an int它丟棄這個double的小數部分,這就是爲什麼(int) 5.9999995而不是6

解決方案:

所以在這裏爲了得到確切值,你可以使用Math.round()方法是這樣的:

x= (int) Math.round(2*3.3/1.1); 

這是顯示這兩種情況之間的差異Live Demo

1

問題是您的雙字面值沒有完全表示。

double a = 6.6; 
    double b = 1.1; 

    System.out.println(Double.toHexString(a)); 
    System.out.println(Double.toHexString(b)); 
    System.out.println("xx: " + new BigDecimal(a)); 
    System.out.println("yy: " + new BigDecimal(b)); 

雖然我們聲明a = 6.6它是二進制重複小數。因此它被截斷。

0x1.a666666666666p2 
0x1.199999999999ap0 

這顯示了表示爲十六進制,最後的「9」四捨五入至「A」,而最後6四捨五入留六人。

然後,我們用`BigDecimal的

xx: 6.5999999999999996447286321199499070644378662109375 
yy: 1.100000000000000088817841970012523233890533447265625 

我們可以看到分子被作爲不到6.6近似分母得到近似剛剛超過1.1打印出的實際值。分工的結果。

System.out.println(new BigDecimal(a/b)); 
#5.99999999999999911182158029987476766109466552734375 

然後鑄造int剛截斷浮點的一部分,你的左邊有5

相關問題