2013-01-20 71 views
5

可有人向我解釋爲什麼輸出這樣的:Java中的十進制格式?

double y = 15/7; 
    DecimalFormat first = new DecimalFormat("#.###"); 
    System.out.println(y); 
    String format_string = first.format(y); 
    System.out.println(format_string); 

是這樣的:

2.0 
    2 

(這是錯誤的)

但是,當我改變15/7至

15.0/7.0 

它給了我正確的答案

2.142857142857143 
2.143 

請解釋一下嗎?

謝謝!

回答

3

沒有點的數字是整數,所以15/7是整數運算,結果是2(無餘數除法)。之後它會被轉換成雙精度值,但是它的值爲2(完成操作後的轉換)。

帶點的數字首先是雙打,所以15.0/7.0是雙重操作,並導致您想要的結果(浮點除法)。

3

更換

double y = 15/7; 

double y = 15.0/7; 

當分2 int,你會得到一個int

specification參見:

整數除法輪朝向0。即,商爲 操作數n和d,是經過二進制數值提升 整數(§5.6.2)是一個整值q產生其幅度儘可能大 同時滿足| d·q | ≤| n |。而且,當| n |時,q是正數≥| d | 並且n和d具有相同的符號,但當| n | ≥| d |和 和d有相反的標誌。

你將它轉換爲double通過將其存儲在一個double可變但爲時已晚:你不能失去的精度回來。解決辦法是讓其中一個操作數爲雙倍,以便在分割時得到一個雙精度值。

3

兩個分區integers總是導致integer - 這就是爲什麼你得到22.0格式化後)。

分中至少一個double給你double

在你的情況15/7是兩個整數的除法,其結果是一個整數(不正確的結果)。如果更改爲15/7.015.0/715.0/7.0您的結果將是double正確的結果

1

15/7執行整數除法,其向下取整爲最接近的整數。

15/7 = 2 + 1/7 - >被四捨五入至2

不要緊,你定義Ÿ作爲雙,師並沒有考慮到這一點,因爲它是使用2個整數文字。

1

這是因爲15/72,因爲它正在返回除法操作的整數部分。如果您需要浮點值操作,請執行如下操作:15f/7

1

這兩個值都是整數,所以它們四捨五入爲7.由於整數除法的結果是一個整數,所以您需要確保將雙倍/浮點分開,因爲這些除法的結果是雙/浮點數,可以處理數字的小數部分

即使您指定了一個double來將除法的結果放入實際放入的內容中,但是將double分開意味着結果是double,所以答案包含正確的結果。