99

次の結果が必要です

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

.round()または.setScale()?どうすればいいですか?

4

6 に答える 6

171

を使用setScale()して、小数桁数をゼロに減らすことができます。value丸められる値を保持すると仮定します。

BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);

保持する桁数を指定する必要があるため、使用round()はもう少し複雑です。あなたの例では、これは 3 になりますが、これはすべての値に対して有効ではありません。

BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);

BigDecimal(オブジェクトは不変であることに注意してください。setScaleとの両方roundが新しいオブジェクトを返します。)

于 2010-11-09T13:29:38.450 に答える
15

グロドリゲスの答えで行けば

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

これが出力です

100.23 -> 100
100.77 -> 101

これは私が望んでいるものではないので、結局これをやりました..

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

これは私が得るものです

100.23 -> 100.00
100.77 -> 101.00

これで今のところ私の問題は解決します.. :) ありがとうございます。

于 2010-11-09T13:51:36.907 に答える
5

これは非常に複雑な解決策ですが、うまくいきます:

public static BigDecimal roundBigDecimal(final BigDecimal input){
    return input.round(
        new MathContext(
            input.toBigInteger().toString().length(),
            RoundingMode.HALF_UP
        )
    );
}

テストコード:

List<BigDecimal> bigDecimals =
    Arrays.asList(new BigDecimal("100.12"),
        new BigDecimal("100.44"),
        new BigDecimal("100.50"),
        new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
    System.out.println(roundBigDecimal(bd).toPlainString());
}

出力:

100
100
101
101

于 2010-11-09T13:33:04.177 に答える
3

単に見てください:

http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP

と:

setScale(int precision, int roundingMode)

または、Java 6 を使用している場合は、

http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP

http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html

および次のいずれか:

setScale(int precision, RoundingMode mode);
round(MathContext mc);
于 2010-11-09T13:33:57.860 に答える
0

1 つのコマンドでそのように丸めることはできないと思います。試す

    ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(new BigDecimal("100.12"));
    list.add(new BigDecimal("100.44"));
    list.add(new BigDecimal("100.50"));
    list.add(new BigDecimal("100.75"));

    for (BigDecimal bd : list){
        System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
    }

Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

残りの例をテストしたところ、必要な値が返されましたが、その正確性は保証されません。

于 2010-11-09T13:29:55.373 に答える
-2

あなたがしたい

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP
于 2010-11-09T13:33:30.480 に答える