Округление 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.