Класс BigDecimal
Класс BigDecimal из пакета java.math предназначен для точных вычислений с десятичными числами произвольной длины. В отличие от типов double и float, которые хранят числа в двоичном формате с плавающей точкой и могут давать погрешность, BigDecimal хранит число в виде целого значения (unscaled value) и масштаба (scale). Масштаб определяет количество цифр после десятичной точки. Первым параметром конструктор принимает строковое или числовое представление числа, вторым (необязательным) - масштаб. Класс является неизменяемым (immutable), поэтому все арифметические операции возвращают новый объект BigDecimal, а исходный объект не изменяется.
Синтаксис
BigDecimal num = new BigDecimal("123.45");
BigDecimal num2 = new BigDecimal("123.45", MathContext.DECIMAL128);
Пример
Давайте создадим объект BigDecimal из строки и выведем его значение на экран:
import java.math.BigDecimal;
public class Main
{
public static void main(String[] args)
{
BigDecimal num = new BigDecimal("123.45");
System.out.println(num);
}
}
Результат выполнения кода:
"123.45"
Пример
Давайте сложим два числа с плавающей точкой через BigDecimal и через double, чтобы увидеть разницу в точности:
import java.math.BigDecimal;
public class Main
{
public static void main(String[] args)
{
double a = 0.1;
double b = 0.2;
System.out.println(a + b);
BigDecimal c = new BigDecimal("0.1");
BigDecimal d = new BigDecimal("0.2");
System.out.println(c.add(d));
}
}
Результат выполнения кода:
0.30000000000000004
"0.3"
Пример
Давайте перемножим два числа и получим точный результат с помощью метода multiply:
import java.math.BigDecimal;
public class Main
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal("123.45");
BigDecimal b = new BigDecimal("2");
BigDecimal res = a.multiply(b);
System.out.println(res);
}
}
Результат выполнения кода:
"246.90"
Пример
Давайте разделим одно число на другое с указанием масштаба и режима округления:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal res = a.divide(b, 5, RoundingMode.HALF_UP);
System.out.println(res);
}
}
Результат выполнения кода:
"3.33333"
Пример
Давайте сравним два объекта BigDecimal с помощью метода compareTo:
import java.math.BigDecimal;
public class Main
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal("123.45");
BigDecimal b = new BigDecimal("123.45");
BigDecimal c = new BigDecimal("100.00");
System.out.println(a.compareTo(b));
System.out.println(a.compareTo(c));
System.out.println(c.compareTo(a));
}
}
Результат выполнения кода:
0
1
-1