2014-05-01 36 views
-3

這是我用來計算百分比並將其舍入到小數點後兩位的代碼。然而,此刻,結果出來是45.0%,而非45.33%爲什麼我會得到這個精度錯誤?

int one = 432; 
int rolls = 953; 

double test1 = 100 * one/rolls; 
double finalValue1 = Math.round(test1 * 100.0)/100.0; 

爲什麼沒有小數位顯示?

+0

https://stackoverflow.com/questions/2538787/ how-to-display-an-float-data-with-2-decimal-places-in-java – awksp

+0

沒有小數點的原因是因爲我相當肯定Java會打印最少的數字小數表示'double'。在這種情況下,45.00 = 45.0,所以Java將跳過額外的小數位並打印後者。 – awksp

+0

昨天,**完全相同的問題**被問到。本週是什麼時間「在Java任務中小數點後兩位」? –

回答

0

您可以使用String.format(「%。2f」,test1)。如果你使用round,那麼java會圍繞整數值。因此,以這種方式格式化會給你你所尋求的答案。

0

因爲你是乘以整數測試1的結果是整數
所以你不得不說
double test1= 100.0*one/rolls;
double test1=(double)100*one/rolls

0

問題是與以下行:

double test1 = 100 * one/rolls; 

也就是說因爲100onerolls類型爲int

當你做100 * one,那將導致43200。然後,我們必須執行其餘的計算... 43200/953實際上等於45.330535152,但是因爲這些都是int類型,結果將是45。製作test1 = 45。由於測試之一是雙倍的,它實際上是45.0

由於上述原因,下一個使用test1的計算將會關閉,從而導致「無十進制值」。

要解決此問題,您可以將onerolls的類型更改爲雙倍。

-2

你有兩個的問題。

首先,要執行整數除法

double test1 = 100 * one/rolls; 

100onerolls都是int。這意味着結果是一個整數,而不管你聲明返回類型是什麼。這包括在SO問題Why the result of 1/3=0 in java?中:

結果變量爲double只會導致除法後發生隱式轉換。

如果你想double S,用雙打:

double one = 432.0; 
double rolls = 953.0; 

固定,在你的Math.round(test1 * 100.0)/100.0;分工會產生double後,但可能與精度超過兩個地方。目前還不清楚在這一點上,如果你想進一步舍入到特定精度,但如果你只是想在小數點後打印的兩個數字,你可以使用:

System.out.printf("%.2f", finalValue1);