Как округлять BigDecimal в Java через setScale и RoundingMode

Как округлять BigDecimal в Java через setScale и RoundingMode
Содержание статьи

Чтобы получить число с двумя знаками после запятой, используйте BigDecimal.setScale(2, режим). Режим выбирают по правилам задачи. В примере на Mentoring.digital сравним два правила для значения ровно между соседними результатами и разберём деление, у которого десятичная запись бесконечна.

Создайте число из десятичной строки

Строка сохраняет десятичное значение, которое вы ввели. Передача литерала double в конструктор сначала превращает его в двоичное число. Для учебного примера с точным значением 2.345 удобна строка.

import java.math.BigDecimal;
import java.math.RoundingMode;

var value = new BigDecimal("2.345");
var up = value.setScale(2, RoundingMode.HALF_UP);
var even = value.setScale(2, RoundingMode.HALF_EVEN);

System.out.println(up);   // 2.35
System.out.println(even); // 2.34

Этот фрагмент можно выполнить в JShell или перенести в метод. HALF_UP округляет точную половину от нуля. HALF_EVEN выбирает соседнее значение с чётной последней цифрой. BigDecimal неизменяем, поэтому сохраняйте результат вызова отдельно.

Укажите масштаб при делении

var one = new BigDecimal("1");
var three = new BigDecimal("3");

var share = one.divide(three, 2, RoundingMode.HALF_UP);
System.out.println(share); // 0.33

Точный вариант one.divide(three) завершится ArithmeticException, поскольку результат имеет бесконечную десятичную запись. Перегрузка с масштабом и режимом задаёт правило для такого случая. Деление на ноль также требует отдельной обработки на входе.

Проверьте границу округления

Возьмите 2.344, 2.345 и -2.345. Для каждого значения заранее выпишите результат с выбранным режимом. Если условие требует общего числа значащих цифр, изучите MathContext. Его точность относится ко всему числу, тогда как setScale(2, ...) задаёт масштаб.

Такие задачи можно закрепить на занятиях по Java и обсудить порядок расчётов с наставником по Java.

Похожие статьи по данной теме