2016-09-01 63 views
3

我試圖格式的雙精度精確到小數點後2位,如果有分數,並以其它方式使用的DecimalFormat格式,在Java

所以就砍下2位小數雙和0的整數,我想達到下一個結果:

100.123 -> 100.12 
100.12 -> 100.12 
100.1 -> 100.10 
100  -> 100 

變體#1

DecimalFormat("#,##0.00") 

100.1 -> 100.10 
but 
100 -> 100.00 

變體#2

DecimalFormat("#,##0.##") 

100 -> 100 
but 
100.1 -> 100.1 

有什麼想法在我的情況下選擇什麼樣的模式?

+1

[如何在Java中將數字四捨五入爲小數點後n位](http://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places- in-java) – piyushj

回答

3

我達成的唯一解決方案是使用如果語句就像在這裏提到:https://stackoverflow.com/a/39268176/6619441

public static boolean isInteger(BigDecimal bigDecimal) { 
    int intVal = bigDecimal.intValue(); 
    return bigDecimal.compareTo(new BigDecimal(intVal)) == 0; 
} 

public static String myFormat(BigDecimal bigDecimal) { 
    String formatPattern = isInteger(bigDecimal) ? "#,##0" : "#,##0.00"; 
    return new DecimalFormat(formatPattern).format(bigDecimal); 
} 

測試

myFormat(new BigDecimal("100")); // 100 
myFormat(new BigDecimal("100.1")); // 100.10 

如果有人知道更優雅的方式,請與大家共享!

0

我相信我們需要一個if語句。

static double intMargin = 1e-14; 

public static String myFormat(double d) { 
    DecimalFormat format; 
    // is value an integer? 
    if (Math.abs(d - Math.round(d)) < intMargin) { // close enough 
     format = new DecimalFormat("#,##0.##"); 
    } else { 
     format = new DecimalFormat("#,##0.00"); 
    } 
    return format.format(d); 
} 

應根據情況選擇允許數字視爲整數的餘量。只是不要以爲你會有一個確切的整數,當你期望一個,雙打併不總是這樣工作。

利用上述聲明myFormat(4)返回4myFormat(4.98)返回4.98myFormat(4.0001)返回4.00

+0

我也有一個想法來使用if語句,但希望可以更優雅地使用具有特定模式的DecimalFormat來解決它。 – repitch

+0

您可以創建'DecimalFormat'的子類,並將if語句放入子類中。不知道我真的很喜歡這個想法。 –