Подтвердить что ты не робот

Java BigDecimal: округление до ближайшего целого значения

Мне нужны следующие результаты

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

.round() или .setScale()? Как мне это сделать?

4b9b3361

Ответ 1

Вы можете использовать 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 возвращают новый объект.)

Ответ 2

Если я отвечу Гродригесом, ответьте

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

Это решает мою проблему на данный момент..:) Спасибо всем.

Ответ 3

Здесь очень сложное решение, но оно работает:

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

Ответ 5

Я не думаю, что вы можете обойти его так, как в одной команде. Попробуйте

    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

Я тестировал остальные примеры и возвращал нужные значения, но я не гарантирую его правильность.

Ответ 6

Вы хотите

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