Мне нужны следующие результаты
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
или .setScale()
? Как мне это сделать?
Мне нужны следующие результаты
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
или .setScale()
? Как мне это сделать?
Вы можете использовать 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
возвращают новый объект.)
Если я отвечу Гродригесом, ответьте
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
Это решает мою проблему на данный момент..:) Спасибо всем.
Здесь очень сложное решение, но оно работает:
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
Просто взгляните на:
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);
Я не думаю, что вы можете обойти его так, как в одной команде. Попробуйте
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
Я тестировал остальные примеры и возвращал нужные значения, но я не гарантирую его правильность.
Вы хотите
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP