Округление BigDecimal до * всегда * имеет два десятичных знака

217

Я пытаюсь округлить значения BigDecimal до двух десятичных знаков.

я использую

BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
logger.trace("rounded {} to {}", value, rounded);

но он не делает то, что я хочу последовательно:

rounded 0.819 to 0.82
rounded 1.092 to 1.1
rounded 1.365 to 1.4 // should be 1.37
rounded 2.730 to 2.8 // should be 2.74
rounded 0.819 to 0.82

Меня не волнуют значащие цифры, я просто хочу два знака после запятой. Как мне сделать это с BigDecimal? Или другой класс / библиотека лучше подходит для этого?

Брэд Мейс
источник
9
Если вы действительно хотите округлить, вы должны использовать RoundingMode.HALF_UP
Гилберт Ле Блан

Ответы:

401
value = value.setScale(2, RoundingMode.CEILING)
Луи Вассерман
источник
19
Это действительно работает так, как я хочу. Разница просто в том, что она round()работает со значительными цифрами, в то время как setScaleработает с фиксированным числом десятичных разрядов, или это еще не все?
Брэд Мейс
44
Используйте RoundingMode.HALF_UP, чтобы сделать "типовое округление". То есть 1,111 дает 1,11 [ПОТОЛОК дает 1,12]
Grzegorz Dev
5
Спасибо за RoundingMode.HALF_UP. Согласно документации это метод округления, которому обычно учат в школах - то, что мне было нужно.
серебро
1
Будьте осторожны, если ваши значения могут быть отрицательными, как в бухгалтерском приложении. Возможно, вам придется использовать RoundingMode.UP вместо CEILING
Dale
1
Почему setScale(...)работает? см. BigDecimal setScale и раунд .
Джейсон Лоу