0Pricing
Java Academy · Урок

Работа с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Почему не стоит использовать double для денег
  2. Работа с BigDecimal
  3. Округление и масштаб
  4. BigInteger для огромных чисел
← Назад к Java Academy