Великі числа 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` дозволяють працювати з дуже великими числами та числами з високою точністю, що є критично важливим для фінансових, наукових і технічних обчислень, де примітивні типи не можуть забезпечити необхідну точність або розмір.

Великі числа BigInteger та BigDecimal