2012-12-06 111 views
1

我正在解決一個需要輸出被截斷的問題,令我驚訝的是,我一直無法找到一種在java中截斷數字的方法。截斷double值到6位小數

輸出需要是一個數字後加6位小數。

我想要的是 double truncate(double number,int places)和輸出爲 truncate(14/3.0) = 4.666666

然而我得到的是

public static double round(double value, int places) { 
    if (places < 0) throw new IllegalArgumentException(); 

    long factor = (long) Math.pow(10, places); 
    value = value * factor; 
    long tmp = Math.round(value); 
    return (double) tmp/factor; 
    } 
// rounds(14/3.0 , 6) = 4.666667 

隨着String.format我得到

String.format("%.6f", 14/3.0) = 4.666667 

我也試過一個解決方案,我就發現計算器使用的BigDecimal,暗示這給了我非常相同回答。

NumberFormat似乎也以同樣的方式

java.text.NumberFormat f = java.text.NumberFormat.getNumberInstance(); 
f.setMinimumFractionDigits(6); 
System.out.println(f.format(14/3.0)); // 4.666667 

工作是否有一個內置的方法做到這一點還是我需要寫我使用類似的BigInteger自己? 有什麼我做錯了嗎?

回答

4

那是因爲你沒有截斷但舍:

long tmp = Math.round(value); 

如果您使用的是鑄鐵相反,它應該工作:

long tmp = (long) value; 

所以下面的輸出4.666666的代碼,你希望:

public static void main(String[] args) throws Exception { 
    System.out.println(truncate(14/3.0, 6)); 
} 

public static double truncate(double value, int places) { 
    if (places < 0) { 
     throw new IllegalArgumentException(); 
    } 

    long factor = (long) Math.pow(10, places); 
    value = value * factor; 
    long tmp = (long) value; 
    return (double) tmp/factor; 
} 
+0

我想要一個double值如何使用cast來幫助? – nikhil

+2

@nikhil在你的'round'方法中,我建議將替換方法轉換爲你正在尋找的'truncate'方法。 – assylias

+0

謝謝,它工作。我會盡快將答案標記爲接受。 – nikhil

1

雙打沒有小數位數,你不能截斷到任何特定的數字EM。他們有二進制的地方。如果你需要一個特定的十進制表示法,請使用DecimalFormatBigDecimal.

相關問題