Округление BigDecimal до двух знаков после запятой в Java

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для округления объекта BigDecimal до двух знаков после запятой следует использовать метод setScale(2, RoundingMode.HALF_UP). Таким образом, достигается точность до сотых, округление происходит на уровне .005.

Java
Скопировать код
// Просто как два пальца об асфальт.
BigDecimal rounded = new BigDecimal("123.456").setScale(2, RoundingMode.HALF_UP);

В результате такой операции rounded примет значение 123.46.

Если же нужно округлять всегда вверх, без исключения, стоит выбрать RoundingMode.CEILING:

Java
Скопировать код
// Береженого бог бережет – будем округлять вверх.
BigDecimal roundedUp = new BigDecimal("123.451").setScale(2, RoundingMode.CEILING);

После округления roundedUp станет равным 123.46. Используя CEILING, вы всегда можете быть уверены в округлении в большую сторону.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Способы округления BigDecimal

При работе с BigDecimal можно выбирать метод округления, максимально подходящий под ваши цели.

Округление до ближайшего, как в школе

Метод HALF_UP, который нам знаком со школьной скамьи, часто используется при округлении до ближайшего значения.

Округление вверх

Когда критически важно округление исключительно в большую сторону, используйте CEILING. Такой подход незаменим, например, в финансах, где каждая копейка на вес золота.

Значащие цифры и их влияние

При округлении значащие числа в BigDecimal играют ключевую роль. Обратите на них внимание, чтобы не упустить точность в больших числах.

Выход за рамки стандартных возможностей

Если стандартные возможности Java вам не хватает, обратите внимание на сторонние библиотеки или классы для большего контроля над округлением.

Визуализация

Принцип работы округления проиллюстрируем на примере портного, который к каждой рубашке аккуратно пришивает по две пуговицы:

Java
Скопировать код
// Наведения на порядок рубашку утром...
BigDecimal value = new BigDecimal("123.456");
// ...и она готовая к вечеру!
value = value.setScale(2, RoundingMode.HALF_UP); // Портной со всей ответственностью подходит к долгу: наличие ровно 2 пуговиц

Вот как портной подгоняет пуговицы:

Markdown
Скопировать код
Рубашка с 3 пуговицами (123.456): [🔘, 🔘, 🔘] 👉 [🔘, 🔘]
Рубашка с 1 пуговицей (123.4):   [🔘] 👉 [🔘, 🔘]
Рубашка идеальна (123.00):     [🔘, 🔘] // И так всё супер!

Таким образом, у каждого значения BigDecimal появляется идеальная пара десятичных пуговиц! ✨

Продвинутое округление BigDecimal

Разное количество десятичных знаков

Числа с разной дробной частью можно стандартизировать при помощи метода setScale, сведя количество чисел после запятой к двум. Это сделает отображение данных в приложении единообразным.

Дополнительные нули

Если нужно отображать два знака после запятой во всех случаях, BigDecimal дополнит число нулями:

Java
Скопировать код
// Пытаемся добиться двух знаков после запятой – и у нас получается!
BigDecimal exactTwo = new BigDecimal("123").setScale(2, RoundingMode.HALF_UP);

В вышеуказанном примере exactTwo выведется как 123.00, полностью соответствуя указанным требованиям.

Переполнение и потеря точности

Будьте внимательны при работе с BigDecimal, когда используете переполнение или потерю точности при арифметических операциях. Воспользуйтесь проверками, чтобы избежать ArithmeticException или неожиданной потери данных.

Полезные материалы

  1. BigDecimal (Java Platform SE 8) — Официальная документация BigDecimal.
  2. RoundingMode (Java Platform SE 8) — Подробная инструкция по способам округления в Java.
  3. java – Round a double to 2 decimal places – Stack Overflow — Обсуждение техник округления дробных чисел.
  4. Using BigDecimal to work with currencies – Stack Overflow — Советы по использованию BigDecimal при работе с валютой.
  5. DecimalFormat (Java Platform SE 8) — Использование DecimalFormat для форматирования чисел с помощью BigDecimal.
  6. Java Practices->Representing money — Лучшие практики использования BigDecimal для представления финансовых данных в Java.