2014-09-19 43 views
0

我可以看到有數百條關於舍入小數位的主題。然而,我搜索了高和低,似乎無法找到與我的問題相匹配的以前的實例。 我對Java很新。如何在Java中將計算結果四捨五入到小數點後n位

我想計算一個線的斜率,將它分配給一個變量,並將該變量的內容格式化爲4個小數位。

我試過DecimalFormat(看起來返回一個字符串,我需要一個數值,可以在另一個計算階段使用) 我試過BigDecimal(似乎無法弄清楚如何構造它和setScale)。
下面是我的代碼:

import java.math.BigDecimal; 


public class Scratch { 
    public static void main(String[] args) throws Exception { 
     BigDecimal slope1, slope2, slope3; 

     slope1 = new BigDecimal((8 - 8)/(20 - 5)); 
     slope2 = new BigDecimal((9 - 8)/(22 - 5)); 
     slope3 = new BigDecimal((9 - 8)/(22 - 20)); 
     slope1 = slope1.setScale(4); 
     slope2 = slope1.setScale(4); 
     slope3 = slope1.setScale(4); 
     System.out.println(slope1); 
     System.out.println(slope2); 
     System.out.println(slope3); 



    } 


} 

輸出的結果是:

0.0000 
0.0000 
0.0000 

如何我構建大數據對象,設置它的規模,並做計算的方式,將給計算實際結果到4位小數而不是0.0000?

任何幫助將不勝感激。幾個小時我一直在搞這個。

+3

數據到達之前的BigDecimal計算完成。基本上你正在做'slope3 = new BigDecimal(0);' – njzk2 2014-09-19 21:03:39

+1

你從來不會從slope1以外獲得除零之外的任何東西 - 因爲分子(8-8)爲零,就像其他人一樣 - 正如你所提到的那樣需要把比率變成雙重第一。 – HexedAgain 2014-09-19 21:17:36

回答

0

什麼是真正這裏的問題是INT算術

(9 - 8)/(20 - 5)等於1/15這INT算術等於0

爲了讓你必須要通過在數字double的至少一個執行雙重算術正確的結果:

((double)(9 - 8)/(20 - 5))((9.0 - 8)/(20 - 5))

0

變化 slope1 = new BigDecimal((8 - 8)/(20 - 5));slope1 = new BigDecimal(((double)8 - 8)/((double)20 - 5));

1

整數運算所有的整數。

slope1 = new BigDecimal((8d - 8d)/(20d - 5d)); 
    slope2 = new BigDecimal((9d - 8d)/(22d - 5d)); 
    slope3 = new BigDecimal((9d - 8d)/(22d - 20d)); 

爲了使您的代碼正常工作,請將d追加爲double。基本上所發生的是所有的數字都被認爲是整數,並且執行整數映射的魔法值爲9/8,其值爲1.其他選項包括用小數點進行強制轉換或將組合值加倍。

slope2 = new BigDecimal((9.0 - 8.0)/(22.0 - 5.0)); 

slope2 = new BigDecimal((double) (9 - 8)/(double) (22 - 5)); 
+0

非常感謝您回覆我。我添加了您推薦的更改以及下面另一條評論中推薦的內容。它看起來接近工作,但現在我得到一個錯誤「RoundingMode無法解析爲變量」我以前嘗試過使用RoundingMode並遇到同樣的問題,因此離開它。我有import語句import java.math.BigDecimal;包含在類聲明上方的代碼中(未在我之前的示例中顯示)。 – user3599617 2014-09-19 23:43:48

+0

似乎我現在工作。我設法做到了,而不用調用大十進制。你在公式中添加雙重類型的線索是突破。非常感謝您的建議。雙斜率1 =((double)(p2.y - p1.y)/(double)(p2.x - p1.x));雙斜率2 =((double)(p1.y - p.y)/(double)(p1.x - p.x));雙斜率3 =((double)(p2.y - p.y)/(double)(p2.x - p.x)); – user3599617 2014-09-19 23:52:33

3

你有兩個問題在這裏。

第一個是你在你的BigDecimal的構造函數中使用整數運算。 您可以通過將值轉換爲double來解決此問題。

你的第二個問題是,你要設置的slope1三次規模,這裏忽略了slope2slope3值:

slope1 = slope1.setScale(4); 
slope2 = slope1.setScale(4); // should be slope2 
slope3 = slope1.setScale(4); // should be slope3 

但是,當你解決這個問題,你會得到一個ArithmeticException時您嘗試計算slope2。無論何時使用scale()四捨五入一個數字,您都需要指定RoundingMode,以便它知道如何您想四捨五入。

試試這個:

slope1 = new BigDecimal((double) (8 - 8)/(20 - 5)); 
    slope2 = new BigDecimal((double) (9 - 8)/(22 - 5)); 
    slope3 = new BigDecimal((double) (9 - 8)/(22 - 20)); 
    slope1 = slope1.setScale(4, RoundingMode.HALF_UP); 
    slope2 = slope2.setScale(4, RoundingMode.HALF_UP); 
    slope3 = slope3.setScale(4, RoundingMode.HALF_UP); 
    System.out.println(slope1); // 0.0000 
    System.out.println(slope2); // 0.0588 
    System.out.println(slope3); // 0.5000 
相關問題