Java BigDecimal:最も近い整数値に丸めます


89

次の結果が必要です

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

.round()または.setScale()?これについてどうすればよいですか?

回答:


151

を使用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オブジェクトが不変であり、両方setScaleround新しいオブジェクトを返します。)


1
機能していない:100.12:100.12、100.44:100.44、100.50:100.5、100.75:100.75
ボリスパブロビッチ

3
いいえ、スケールを設定すると、最初の小数点とは異なる新しい10進数が返されます。例:BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));falseを出力する
Daniel Fath

6
@ダニエル:それは私が私の回答に投稿したコードスニペットですでに暗示されていました。私はそれを明示的にしました。
Grodriguez、2010年

RoundingModeそれは何ですか?それはBigDecimal
三部作


10

グロドリゲスの答えで行くなら

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

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


7
最初の結果は「私が望んでいるものではない...」という声明に興味があります。実際に出力フォーマットに関心がある場合は、DecimalFormat(のようにnew DecimalFormat("###.00"))を使用しBigDecimalて、文字列への変換を管理できます。"101.00"@Grodriquezからのスニペットとあなたが作成した両方の値の結果が得られます。
joel.neely

3
2回目の丸めは、整数が既にあることがわかっているので不要です。代わりに、BigDecimal.ROUND_UNNECESSARYを使用します。私の意見ではもう少し明確です。
kosmoplan 2017

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


このソリューションなどを推奨するわけではありませんが、次のinput.toBigInteger().toString().length()ような対数を使用することで、部分ははるかに効率的になりますround_up(log(input)) + (1 if input is a power of ten, else 0)
Addison


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

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


-2

あなたが欲しい

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP

2
これは何もしません。round「精度設定が0の場合、丸めは行われません。」のドキュメントから。
グロドリゲス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.