1

を使用して丸めようとしてBigDecimal.ROUND_HALF_UPいますが、期待される結果が得られません。このコード:

String desVal="21.999";  
BigDecimal decTest=new BigDecimal(
    String.valueOf(desVal)
)
.setScale(
    Integer.parseInt(decimalPlaces), BigDecimal.ROUND_DOWN
);     
System.out.println(decTest); 

次の結果が得られます。

decimalPlaces=1 it is displaying 21.9 //correct 
decimalPlaces=2 displaying 21.99 //correct 
decimalplaces=3 displaying 21.999 //correct 
decimalplaces=4 displaying 21.9990 //incorrect 

私は以下を取得したい:

decimalPlaces=1 should display 21.9      
decimalPlaces=2 should display 21.99 
decimalplaces=3 should display 21.999 
decimalplaces=4 should display 21.999 

標準 Java (つまり、外部ライブラリなし) でこれを行う方法はありますか?

4

4 に答える 4

3

BigDecimal#stripTrailingZeros()を使用します。

String[] decimalPlaces = new String[] {"2", "2", "3", "4", "4"};
String[] desVal = new String[] {"20", "21.9", "21.90", "21.99999", "21.99990"};

for (int i = 0; i < desVal.length; i++) {
    BigDecimal decTest = new BigDecimal(desVal[i]);

    if (decTest.scale() > 0 && !desVal[i].endsWith("0") &&  !(Integer.parseInt(decimalPlaces[i]) > decTest.scale())) {
        decTest = decTest.setScale(Integer.parseInt(decimalPlaces[i]),
                BigDecimal.ROUND_DOWN).stripTrailingZeros();
    }
    System.out.println(decTest);
}

出力:

20
21.9
21.90
21.9999
21.99990
于 2013-06-26T13:46:18.577 に答える
0

すべてではなく末尾のゼロを出力したい場合は、DecimalFormatが必要です。秘訣は、あなたの場合、元の入力文字列の小数点以下の桁数に応じてフォーマット文字列を作成する必要があるということです。

    int decimalPlaces = 10;
    String desVal="21.99900";  

    // find the decimal part of the input (if there is any)
    String decimalPart = desVal.contains(".")?desVal.split(Pattern.quote("."))[1]:"";

    // build our format string, with the expected number of digits after the point
    StringBuilder format = new StringBuilder("#");
            if (decimalPlaces>0) format.append(".");
    for(int i=0; i<decimalPlaces; i++){
        // if we've passed the original decimal part, we don't want trailing zeroes
        format.append(i>=decimalPart.length()?"#":"0");
    }

    // do the rounding
    BigDecimal decTest=new BigDecimal(
        String.valueOf(desVal)
    )
    .setScale(
        decimalPlaces, BigDecimal.ROUND_DOWN
    );   

    NumberFormat nf = new DecimalFormat(format.toString());
    System.out.println(nf.format(decTest));
于 2013-06-26T14:32:38.163 に答える
0
int decPlaces = Math.min(Integer.parseInt(decimalPlaces), 
                         desVal.length() - desVal.indexOf(".") + 1);
BigDecimal decTest=
      new BigDecimal(String.valueOf(desVal)).
             setScale(decPlaces, BigDecimal.ROUND_DOWN);
于 2013-06-26T13:46:05.257 に答える
0

java.text.NumberFormat を使用できます

NumberFormat nf = NumberFormat.getInstance();

System.out.println(nf.format(decTest));

元のスケールを維持したい場合は、

String desVal="21.99901";  
BigDecimal decTest=new BigDecimal(String.valueOf(desVal)); 
int origScale = decTest.scale();
decTest = decTest.setScale(4, BigDecimal.ROUND_DOWN);
System.out.println(String.format("%."+origScale+"f", decTest));
于 2013-06-26T13:51:36.753 に答える