2011-12-13 76 views
8

我有一系列的Java小數,如:如何在Java中捨去十進制而不捨入?

0.43678436287643872 
0.4323424556455654 
0.6575643254344554 

我希望後5位小數切斷一切。這怎麼可能?

+1

從技術上講,沒有:切斷進一步小數的行爲*是*四捨五入,只你總是舍入到小數點後5位。請參閱下面的答案,瞭解您的選項。 – Piskvor

+1

你想要結果是一個字符串或數字? –

+0

我想要結果是一個數字 – Zubair

回答

23

如果你想使事情變得簡單而快捷。 ;)

public static void main(String... args) { 
    double[] values = {0.43678436287643872, 0.4323424556455654, 0.6575643254344554, 
      -0.43678436287643872, -0.4323424556455654, -0.6575643254344554, 
      -0.6575699999999999 }; 

    for (double v : values) 
     System.out.println(v + " => "+roundDown5(v)); 
} 

public static double roundDown5(double d) { 
    return (long) (d * 1e5)/1e5; 
} 

// Or this. Slightly slower, but faster than creating objects. ;) 
public static double roundDown5(double d) { 
    return Math.floor(d * 1e5)/1e5; 
} 

打印

0.43678436287643874 => 0.43678 
0.4323424556455654 => 0.43234 
0.6575643254344554 => 0.65756 
-0.43678436287643874 => -0.43678 
-0.4323424556455654 => -0.43234 
-0.6575643254344554 => -0.65756 
-0.6575699999999999 => -0.65756 
+2

偉大的解決方案!簡單而棘手。我喜歡它! thx – nowaq

+0

這可能只是最好的解決方案!我只是在接受它之前試圖找到任何問題! – Zubair

+0

-0.657569呢,這是否會產生-0.65756? – Zubair

17
float f = 0.43678436287643872; 
BigDecimal fd = new BigDecimal(f); 
BigDecimal cutted = fd.setScale(5, RoundingMode.DOWN); 
f = cutted.floatValue(); 
+0

這不是最後一個小數位嗎? OP想要避免這種情況。 – tobiasbayer

+0

HALF_UP不正確。可能是「DOWN」? – Kent

+0

是的,當然,下。 – Artem

7
Double.parseDouble(String.valueOf(x).substring(0,7)); 

OR

Double.valueOf(String.valueOf(x).substring(0,7)); 

其中x包含要剪切的值,如0.43678436287643872

+0

您可以編輯您的答案,而不是發表評論。 –

+0

@Piskvor:我的錯。我沒有計算「0」。編輯。 – Kris

+0

@HarryJoy:謝謝你的建議 – Kris

6

DecimalFormat也可以提供幫助這裏:

double d = 0.436789436287643872; 
    DecimalFormat df = new DecimalFormat("0.#####"); 
    df.setRoundingMode(RoundingMode.DOWN); 

    double outputNum = Double.valueOf(df.format(d)); 
    String outpoutString = df.format(d); 
1

我會用正則表達式是這樣做的:

double[] values = { 
      0.43678436287643872, 
      0.4323424556455654, 
      0.6575643254344554, 
      -0.43678436287643872, 
      -0.4323424556455654, 
      -0.6575643254344554 
    }; 

    Pattern p = Pattern.compile("^(-?[0-9]+[\\.\\,][0-9]{1,5})?[0-9]*$"); 
    for(double number : values) { 
     Matcher m = p.matcher(String.valueOf(number)); 
     boolean matchFound = m.find(); 
     if (matchFound) { 
      System.out.println(Double.valueOf(m.group(1))); 
     } 
    } 

模式可以,如果你需要支持更方便地進行修改/小數點以下。

1

要概括彼得回答,你可以這樣做:

public static double round(double n, int decimals) { 
    return Math.floor(n * Math.pow(10, decimals))/Math.pow(10, decimals); 
}