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, их диапазоны и переполнение.