Работа с BigDecimal
Точная арифметика десятичных чисел
«Работа с BigDecimal» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Точная десятичная арифметика
BigDecimal из пакета java.math представляет десятичные числа с произвольной точностью и без скрытых ошибок округления. Это стандартный инструмент для финансовых расчётов.
Создание BigDecimal
Безопаснее всего создавать BigDecimal из строки. Это сохраняет цифры в точности такими, как Вы их указали.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal amount = new BigDecimal("42.50");
System.out.println(amount);
}
}Неизменяемость
BigDecimal является неизменяемым. Операции вроде add не изменяют исходное значение, а возвращают новый объект BigDecimal. Необходимо сохранить возвращённое значение.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("10");
a.add(new BigDecimal("5"));
System.out.println(a);
}
}Сложение и вычитание
Используйте add и subtract, не забывая сохранять результат. Каждый вызов возвращает новое значение.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal price = new BigDecimal("19.99");
BigDecimal tax = new BigDecimal("1.60");
BigDecimal total = price.add(tax);
System.out.println(total);
}
}Умножение
multiply работает ожидаемым образом. Обратите внимание: scale результата равен сумме scale операндов.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal unit = new BigDecimal("2.50");
BigDecimal qty = new BigDecimal("3");
System.out.println(unit.multiply(qty));
}
}Деление требует осторожности
Деление значений, которые не делятся нацело, например 1 на 3, даёт бесконечную десятичную дробь. Обычный вызов divide в таком случае вызывает ArithmeticException.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal one = new BigDecimal("1");
BigDecimal three = new BigDecimal("3");
try {
System.out.println(one.divide(three));
} catch (ArithmeticException e) {
System.out.println("Need to specify rounding!");
}
}
}Деление с округлением
Чтобы безопасно выполнить деление, укажите scale и RoundingMode. В этом примере сохраняются два знака после запятой, а половинные значения округляются вверх.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal one = new BigDecimal("1");
BigDecimal three = new BigDecimal("3");
System.out.println(one.divide(three, 2, RoundingMode.HALF_UP));
}
}Сравнение значений
Для сравнения числовых значений используйте compareTo. Не используйте equals, поскольку equals учитывает scale: значения 2.0 и 2.00 не равны по equals, но равны по compareTo.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("2.00");
System.out.println(a.equals(b));
System.out.println(a.compareTo(b) == 0);
}
}Полезные константы
BigDecimal предоставляет готовые константы: BigDecimal.ZERO, BigDecimal.ONE и BigDecimal.TEN. Используйте их вместо создания собственных.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal sum = BigDecimal.ZERO;
sum = sum.add(BigDecimal.TEN);
System.out.println(sum);
}
}Суммирование списка
Распространённый приём — начать с BigDecimal.ZERO и добавлять каждое значение в цикле, каждый раз сохраняя результат.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal[] prices = {
new BigDecimal("1.10"),
new BigDecimal("2.20"),
new BigDecimal("3.30")
};
BigDecimal total = BigDecimal.ZERO;
for (BigDecimal p : prices) {
total = total.add(p);
}
System.out.println(total);
}
}Рекомендации
Запомните главное: создавайте значения из строк, учитывайте их неизменяемость, всегда указывайте округление при делении и сравнивайте значения с помощью compareTo.
Быстрая проверка
Проверьте свои знания о BigDecimal.
Повторение
Вы научились работать с BigDecimal:
- Создавайте его из строки, чтобы сохранить точные цифры
- Он неизменяем, поэтому сохраняйте результат каждой операции
- Используйте напрямую
add,subtractиmultiply - Для незавершающихся результатов
divideтребует scale иRoundingMode - Сравнивайте значения с помощью
compareTo, а неequals
Часто задаваемые вопросы
Урок «Работа с BigDecimal» бесплатный?
Да — полный текст урока «Работа с BigDecimal» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Работа с BigDecimal»?
Точная арифметика десятичных чисел Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Работа с BigDecimal»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему не стоит использовать double для денег
- Работа с BigDecimal
- Округление и масштаб
- BigInteger для огромных чисел