Великі числа BigInteger та BigDecimal
У Java класи `BigInteger` і `BigDecimal` з пакету `java.math` призначені для роботи з великими або точними числами, які не можуть бути представлені стандартними примітивними типами, такими як `int`, `long`, або `double`.
Клас `BigInteger`
`BigInteger` використовується для представлення цілих чисел будь-якого розміру (навіть дуже великих), яких не можна зберігати в стандартних примітивних типах. На відміну від примітивних типів, які мають обмежений розмір (наприклад, `int` може зберігати значення від -2³¹ до 2³¹-1), `BigInteger` може зберігати ціле число практично будь-якого розміру.
Створення об’єкта `BigInteger`
Для створення об’єкта `BigInteger` використовують рядки або існуючі цілі числа.
- Конструктор з рядка:
BigInteger bigInt1 = new BigInteger(“12345678901234567890”); - Статичні методи для створення:
BigInteger.valueOf(long value): для створення `BigInteger` на основі типу `long`.
BigInteger bigInt2 = BigInteger.valueOf(12345L);
Основні операції з `BigInteger`
Клас `BigInteger` надає методи для математичних операцій, оскільки оператори типу `+`, `-`, `*`, `/` не підтримуються з об’єктами цього класу.
- Додавання:
BigInteger sum = bigInt1.add(bigInt2); - Віднімання:
BigInteger difference = bigInt1.subtract(bigInt2); - Множення:
BigInteger product = bigInt1.multiply(bigInt2); - Ділення:
BigInteger quotient = bigInt1.divide(bigInt2); - Залишок від ділення:
BigInteger remainder = bigInt1.remainder(bigInt2); - Піднесення до степеня:
BigInteger power = bigInt1.pow(2); // bigInt1^2 - Порівняння чисел:
int comparison = bigInt1.compareTo(bigInt2);
// comparison < 0: bigInt1 < bigInt2
// comparison == 0: bigInt1 == bigInt2
// comparison > 0: bigInt1 > bigInt2
Приклад використання `BigInteger`:
import java.math.BigInteger;
public class BigIntegerExample {
public static void main(String[] args) {
BigInteger bigInt1 = new BigInteger(“12345678901234567890”);
BigInteger bigInt2 = BigInteger.valueOf(10000L);
// Додавання
BigInteger sum = bigInt1.add(bigInt2);
System.out.println(“Сума: ” + sum);
// Множення
BigInteger product = bigInt1.multiply(bigInt2);
System.out.println(“Добуток: ” + product);
// Ділення
BigInteger quotient = bigInt1.divide(bigInt2);
System.out.println(“Частка: ” + quotient);
}
}
Клас `BigDecimal`
`BigDecimal` використовується для представлення дробових чисел з високою точністю. Він особливо корисний для фінансових і наукових обчислень, де точність важлива, і де типи `float` і `double` можуть давати похибки через обмежену точність.
Створення об’єкта `BigDecimal`
Як і у випадку з `BigInteger`, об’єкти `BigDecimal` створюються за допомогою рядків або значень примітивних типів.
- Конструктор з рядка:
BigDecimal bigDec1 = new BigDecimal(“12345.67890”); - Статичні методи для створення:
BigDecimal.valueOf(double value): створює `BigDecimal` на основі типу `double`.
BigDecimal bigDec2 = BigDecimal.valueOf(12345.67);
Основні операції з `BigDecimal`
Методи для операцій з дробовими числами аналогічні методам класу `BigInteger`.
- Додавання:
BigDecimal sum = bigDec1.add(bigDec2); - Віднімання:
BigDecimal difference = bigDec1.subtract(bigDec2); - Множення:
BigDecimal product = bigDec1.multiply(bigDec2); - Ділення (при діленні можна вказати точність округлення):
BigDecimal quotient = bigDec1.divide(bigDec2, 2, RoundingMode.HALF_UP);
Важливо вказати режим округлення для уникнення проблем з точністю.
Округлення у `BigDecimal`
Округлення можна виконати за допомогою методу `setScale()`, де вказується кількість знаків після коми і режим округлення:
Приклад округлення:
BigDecimal rounded = bigDec1.setScale(2, RoundingMode.HALF_UP); // Округлення до 2 знаків після коми
Приклад використання `BigDecimal`:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
public static void main(String[] args) {
BigDecimal bigDec1 = new BigDecimal(“12345.67890”);
BigDecimal bigDec2 = BigDecimal.valueOf(100.50);
// Додавання
BigDecimal sum = bigDec1.add(bigDec2);
System.out.println(“Сума: ” + sum);
// Множення
BigDecimal product = bigDec1.multiply(bigDec2);
System.out.println(“Добуток: ” + product);
// Ділення з округленням
BigDecimal quotient = bigDec1.divide(bigDec2, 2, RoundingMode.HALF_UP);
System.out.println(“Частка: ” + quotient);
// Округлення до двох знаків після коми
BigDecimal rounded = bigDec1.setScale(2, RoundingMode.HALF_UP);
System.out.println(“Округлене значення: ” + rounded);
}
}
Висновок
Класи `BigInteger` і `BigDecimal` дозволяють працювати з дуже великими числами та числами з високою точністю, що є критично важливим для фінансових, наукових і технічних обчислень, де примітивні типи не можуть забезпечити необхідну точність або розмір.