Округлення 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 [CEILING дає 1.12]
Grzegorz Dev

5
Дякуємо за RoundingMode.HALF_UP. Згідно з документацією, це метод округлення, який зазвичай навчають у школах - те, що мені потрібно.
срібло

1
Будьте уважні, чи можуть ваші значення бути негативними, як у програмі обліку. Можливо, вам доведеться використовувати RoundingMode.UP замість CEILING
Дейл

1
Чому setScale(...)працює? див. BigDecimal setScale та круглі .
Закон Джейсона
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.