2015-06-15 43 views
1

我正在研究一個縮放系統,將數字縮小25%並四捨五入到最接近的整數,爲此,我試圖依靠損失通過將double轉換爲int來實現精度。有什麼辦法可以解決這個問題嗎?或者我應該以不同的方式去解決它?如何解決在Java中可能的精度錯誤損失

public int[] scaleMarks(int[] marks) 
{ 
    double scale = 1.25; 
    double temp1; 
    int temp2; 

    for(int i = 0; i < marks.length; i++) 
    { 
     temp1 = marks[i] * scale; 
     temp2 = marks[i] * scale; //***Loss of precision here*** 

     if(temp1-temp2>= 0.5) 
     { 
      temp2++; 
     } 
     marks[i] = temp2; 

    } 


    return marks; 
} 
+3

「試圖依靠精度的損失」.....這似乎很危險。 – Mshnik

+0

將一個double投射到一個int將不會舍入到最近的int,它會將其放置。 – shmosel

+0

好吧,我知道它會成爲實際值之下最接近的整數,我將使用兩者之間的差異來確定我應該繞過哪條路,但我認爲我只是將它解決了出來。通過使它 temp2 =(int)(marks [i] * scale); 它似乎編譯,但我目前無法測試它,因爲我的筆記本電腦不允許我運行編譯的文件。 – spar1784

回答

3

您需要Math.round圓的產品,以便它可以被鑄造成int安全。

marks[i] = (int) Math.round(marks[i] * scale); 
+0

看起來它會縮短我的代碼很多。當我有機會時,我一定會測試它。 – spar1784

0

如果你想要圓到最近而不是截斷,你需要使用Math.round。

public class Test { 
    public static void main(String[] args) { 
    System.out.println((int)0.999999); 
    System.out.println(Math.round(0.999999)); 
    } 
} 

輸出

0 
1 
0

可以使用Math.round功能,避免它:

(int)Math.round(marks[i] * scale); 

編輯:你將不得不將它轉換爲int,因爲如果你不」這樣做的結果將是錯誤的(因爲scale這是一個double)。

我期待它對您有所幫助!