Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

BigDecimal в Java: отличия методов setScale и round

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

Для настройки количества знаков после запятой и выбора способа округления числа типа BigDecimal используйте метод setScale(int newScale, RoundingMode roundingMode). К примеру, для округления числа до двух знаков после запятой с применением арифметического округления выполните следующее действие:

Java
Скопировать код
BigDecimal result = new BigDecimal("2.345").setScale(2, RoundingMode.HALF_UP);

В результате такого округления вы получите 2.35, поскольку третий знак после запятой подвергся округлению. В соответствии с требованиями вы можете выбрать подходящий режим округления, например, HALF_EVEN для округления по "банковским правилам" или DOWN для отбрасывания избыточных цифр.

Кинга Идем в IT: пошаговый план для смены профессии

Сравниваем методы: setScale или round?

При выборе между setScale и round необходимо учитывать их влияние на точность чисел типа BigDecimal. Масштаб определяет количество цифр после десятичной запятой, тогда как точность — это общее число значащих цифр в числе.

Применение setScale позволяет задать точное количество цифр после запятой, а комбинирование с RoundingMode предоставляет контроль над процессом округления избыточных цифр.

Тем временем, метод round использует объект MathContext, который задает ограничение на точность числа и аккумулирует как масштаб, так и точность. Использование round может влиять на оба параметра, в зависимости от примененного MathContext.

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

Основные способы использования RoundingMode

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

  1. RoundingMode.UP – Округление от нуля вверх.
  2. RoundingMode.DOWN – Округление к нулю.
  3. RoundingMode.CEILING – Округление к положительной бесконечности.
  4. RoundingMode.FLOOR – Округление к отрицательной бесконечности.
  5. RoundingMode.HALF_UP – Округление вверх, при значении на позиции округления 5 или больше.
  6. RoundingMode.HALF_DOWN – Округление вниз, если значение на позиции округления меньше 5.
  7. RoundingMode.HALF_EVEN – Округление к ближайшему четному числу.
  8. RoundingMode.UNNECESSARY – Округление не выполняется, возвращаемое число предполагается точным.

Понимание правил: точность и масштаб

Важно различать точность и масштаб при работе с BigDecimal:

  • Точность — это общее количество значимых цифр числа.
  • Масштаб — количество цифр после десятичной точки.

Как влияет точность

Рассмотрим влияние точности на примере использования метода round:

Java
Скопировать код
MathContext mc = new MathContext(2, RoundingMode.HALF_UP);
BigDecimal number = new BigDecimal("123.456");
BigDecimal result = number.round(mc); // Итогом станет 120, так как точность установлена в 2

Здесь 120 демонстрирует влияние точности на количество цифр числа по обе стороны от запятой.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Как влияет масштаб

Теперь приведем пример влияния масштаба:

Java
Скопировать код
BigDecimal number = new BigDecimal("123.456");
BigDecimal result = number.setScale(1, RoundingMode.HALF_UP); // После округления будет получено значение 123.5

Результат 123.5 показывает изменение только дробной части числа — количество цифр после запятой.

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

Визуализируйте шкалу точности:

🔢 Исходное число: 3.14159265

🎚️ Настройка точности: setScale(2)

Выберем режим округления: HALF_UP

Ожидаемый результат: 3.14

Здесь метод setScale функционирует как контроллер точности, тогда как round обрубает избыточные значения, превращая число в ожидаемое представление.

Использование setScale(2, RoundingMode.HALF_UP) конвертирует исходное число в формат, соответствующий заданному масштабу.

Практическое использование setScale и round

Работа с валютой

При финансовых операциях:

Java
Скопировать код
BigDecimal payment = new BigDecimal("123.656");
BigDecimal roundedPayment = payment.setScale(2, RoundingMode.HALF_EVEN); // Этот метод округления часто используется в банковской сфере

Расчет налогов

При расчете налогов:

Java
Скопировать код
BigDecimal taxRate = new BigDecimal("0.0875");
BigDecimal price = new BigDecimal("9.99");
BigDecimal tax = price.multiply(taxRate).setScale(2, RoundingMode.HALF_UP); // Для исключения избыточных знаков после запятой

Соблюдение международных норм округления

Для соответствия международным стандартам округления:

Java
Скопировать код
BigDecimal value = new BigDecimal("7.5");
BigDecimal roundedForSwedish = value.setScale(0, RoundingMode.HALF_EVEN); // Например, округление применяемое в Швеции

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

  1. BigDecimal (Java Platform SE 8) – Официальная документация Java по методу BigDecimal.setScale.
  2. Primitive Data Types (Java Tutorials) – Информация о типах данных и способах округления в языке Java.
  3. Using BigDecimal to work with currencies – Stack Overflow – Советы по использованию BigDecimal в работе с валютами.
  4. IBM Developer – Рекомендации и лучшие практики по использованию BigDecimal в Java.
  5. DZone: Precise decimal calculation with Java BigDecimal – Обзор точных десятичных вычислений с использованием BigDecimal в Java.
  6. NumberFormat (Java Platform SE 8 ) – Документация по классу NumberFormat в Java.
  7. Подробное рассмотрение BigDecimal – Обучающее видео на YouTube – Обучающее видео о BigDecimal.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой метод используется для настройки количества знаков после запятой в BigDecimal?
1 / 5