Округление BigDecimal до двух знаков после запятой в Java
Быстрый ответ
Для округления объекта BigDecimal до двух знаков после запятой следует использовать метод setScale(2, RoundingMode.HALF_UP). Таким образом, достигается точность до сотых, округление происходит на уровне .005.
// Просто как два пальца об асфальт.
BigDecimal rounded = new BigDecimal("123.456").setScale(2, RoundingMode.HALF_UP);
В результате такой операции rounded примет значение 123.46.
Если же нужно округлять всегда вверх, без исключения, стоит выбрать RoundingMode.CEILING:
// Береженого бог бережет – будем округлять вверх.
BigDecimal roundedUp = new BigDecimal("123.451").setScale(2, RoundingMode.CEILING);
После округления roundedUp станет равным 123.46. Используя CEILING, вы всегда можете быть уверены в округлении в большую сторону.

Способы округления BigDecimal
При работе с BigDecimal можно выбирать метод округления, максимально подходящий под ваши цели.
Округление до ближайшего, как в школе
Метод HALF_UP, который нам знаком со школьной скамьи, часто используется при округлении до ближайшего значения.
Округление вверх
Когда критически важно округление исключительно в большую сторону, используйте CEILING. Такой подход незаменим, например, в финансах, где каждая копейка на вес золота.
Значащие цифры и их влияние
При округлении значащие числа в BigDecimal играют ключевую роль. Обратите на них внимание, чтобы не упустить точность в больших числах.
Выход за рамки стандартных возможностей
Если стандартные возможности Java вам не хватает, обратите внимание на сторонние библиотеки или классы для большего контроля над округлением.
Визуализация
Принцип работы округления проиллюстрируем на примере портного, который к каждой рубашке аккуратно пришивает по две пуговицы:
// Наведения на порядок рубашку утром...
BigDecimal value = new BigDecimal("123.456");
// ...и она готовая к вечеру!
value = value.setScale(2, RoundingMode.HALF_UP); // Портной со всей ответственностью подходит к долгу: наличие ровно 2 пуговиц
Вот как портной подгоняет пуговицы:
Рубашка с 3 пуговицами (123.456): [🔘, 🔘, 🔘] 👉 [🔘, 🔘]
Рубашка с 1 пуговицей (123.4): [🔘] 👉 [🔘, 🔘]
Рубашка идеальна (123.00): [🔘, 🔘] // И так всё супер!
Таким образом, у каждого значения BigDecimal появляется идеальная пара десятичных пуговиц! ✨
Продвинутое округление BigDecimal
Разное количество десятичных знаков
Числа с разной дробной частью можно стандартизировать при помощи метода setScale, сведя количество чисел после запятой к двум. Это сделает отображение данных в приложении единообразным.
Дополнительные нули
Если нужно отображать два знака после запятой во всех случаях, BigDecimal дополнит число нулями:
// Пытаемся добиться двух знаков после запятой – и у нас получается!
BigDecimal exactTwo = new BigDecimal("123").setScale(2, RoundingMode.HALF_UP);
В вышеуказанном примере exactTwo выведется как 123.00, полностью соответствуя указанным требованиям.
Переполнение и потеря точности
Будьте внимательны при работе с BigDecimal, когда используете переполнение или потерю точности при арифметических операциях. Воспользуйтесь проверками, чтобы избежать ArithmeticException или неожиданной потери данных.
Полезные материалы
- BigDecimal (Java Platform SE 8) — Официальная документация
BigDecimal. - RoundingMode (Java Platform SE 8) — Подробная инструкция по способам округления в Java.
- java – Round a double to 2 decimal places – Stack Overflow — Обсуждение техник округления дробных чисел.
- Using BigDecimal to work with currencies – Stack Overflow — Советы по использованию
BigDecimalпри работе с валютой. - DecimalFormat (Java Platform SE 8) — Использование
DecimalFormatдля форматирования чисел с помощьюBigDecimal. - Java Practices->Representing money — Лучшие практики использования
BigDecimalдля представления финансовых данных в Java.


