Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

BigDecimal

Точное десятичное число — для денег и расчётов, где недопустимы ошибки округления double.

Доступно с: Java 1.1

Синтаксис

public class BigDecimal extends Number implements Comparable<BigDecimal>

Примеры

double ошибается, BigDecimal — нет:

void main() {
    IO.println(0.1 + 0.2);
 
    var a = new BigDecimal("0.1");
    var b = new BigDecimal("0.2");
    IO.println(a.add(b));
}

Результат:

0.30000000000000004
0.3

Расчёт цены с налогом и округлением до центов:

void main() {
    var price = new BigDecimal("19.99");
    var qty = BigDecimal.valueOf(3);
    var tax = new BigDecimal("0.07");
 
    var subtotal = price.multiply(qty);
    var total = subtotal.add(subtotal.multiply(tax)).setScale(2, RoundingMode.HALF_UP);
    IO.println(subtotal);
    IO.println(total);
}

Результат:

59.97
64.17

Деление требует указать точность, а сравнивать нужно через compareTo():

void main() {
    var ten = new BigDecimal("10");
    IO.println(ten.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP));
    try {
        ten.divide(new BigDecimal("3"));
    } catch (ArithmeticException e) {
        IO.println(e.getMessage());
    }
    IO.println(new BigDecimal("2.0").equals(new BigDecimal("2.00")));
    IO.println(new BigDecimal("2.0").compareTo(new BigDecimal("2.00")));
}

Результат:

3.33
Non-terminating decimal expansion; no exact representable decimal result.
false
0

Примечания

Создавайте BigDecimal из строки или через BigDecimal.valueOf(double), а не new BigDecimal(0.1) — конструктор из double сохраняет его ошибку (0.1000000000000000055511...). Объекты неизменяемы: add(), multiply() возвращают новый объект, результат нужно сохранить.

equals() учитывает количество знаков после точки, поэтому 2.0 и 2.00 не равны; для сравнения величин используйте compareTo(). Класс находится в пакете java.math.

См. также

  • BigInteger — Целое число любого размера — когда не хватает даже long.
  • Math.round() — Округляет число до ближайшего целого.
  • Double.parseDouble() — Превращает строку с дробным числом в double.
  • NumberFormat — Форматирует числа, деньги и проценты по правилам выбранной страны.

Вопросы и ответы по теме

В учебнике

  • Примитивные типы — Восемь примитивных типов Java: int, long, double, float, char, boolean, byte и short, их диапазоны и переполнение.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.