BigInteger în Java

Întreg fără limită de mărime (cât îl lasă memoria); BigInteger.valueOf(n) îl creează dintr-un long.

Sintaxă
import java.math.BigInteger;

BigInteger a = new BigInteger("123456789012345678901234567890");
BigInteger b = BigInteger.valueOf(42L);
BigInteger.ZERO, BigInteger.ONE, BigInteger.TWO, BigInteger.TEN

Ce face BigInteger

long are cel mult 19 cifre (până la 9.223.372.036.854.775.807). Peste această limită, adunarea „dă peste cap” și devine negativă fără niciun avertisment. BigInteger ține întregi cu oricâte cifre și nu se depășește niciodată.

Creezi un BigInteger dintr-un text (new BigInteger("…"), eventual cu bază: new BigInteger("ff", 16)) sau dintr-un long cu BigInteger.valueOf(n). Constantele ZERO, ONE, TWO și TEN sunt gata făcute.

Ca BigDecimal, este imutabil și nu folosește operatori: add, subtract, multiply, divide, mod, pow. Înapoi la long treci cu longValueExact(), care aruncă excepție dacă numărul nu încape.

Parametri

Parametru Descriere
text Numărul ca text, doar cifre (și semn).
valoare Pentru valueOf: un long.

Ce returnează

Un obiect BigInteger imutabil.

Exemple

Exemplul 1: long se depășește, BigInteger nu

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        long maxim = Long.MAX_VALUE;
        System.out.println("long: " + maxim + " + 1 = " + (maxim + 1));
        BigInteger mare = BigInteger.valueOf(maxim);
        System.out.println("BigInteger: " + mare + " + 1 = " + mare.add(BigInteger.ONE));
    }
}

Rezultat

long: 9223372036854775807 + 1 = -9223372036854775808
BigInteger: 9223372036854775807 + 1 = 9223372036854775808

Exemplul 2: Valori din text, în baze diferite

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        BigInteger iban = new BigInteger("1234567890123456789012345");
        BigInteger hex = new BigInteger("ff", 16);
        System.out.println("Număr lung: " + iban + ", cifre: " + iban.toString().length());
        System.out.println("ff în baza 16 = " + hex);
        System.out.println("255 în baza 2 = " + hex.toString(2));
        System.out.println("Biți necesari: " + iban.bitLength());
    }
}

Rezultat

Număr lung: 1234567890123456789012345, cifre: 25
ff în baza 16 = 255
255 în baza 2 = 11111111
Biți necesari: 81

Exemplul 3: Înapoi la long, cu verificare

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        BigInteger mic = BigInteger.valueOf(2026);
        BigInteger mare = BigInteger.TEN.pow(20);
        System.out.println("mic ca long: " + mic.longValueExact());
        try {
            System.out.println(mare.longValueExact());
        } catch (ArithmeticException e) {
            System.out.println("10^20 nu încape în long: " + e.getMessage());
        }
        System.out.println("longValue() fără verificare: " + mare.longValue());
    }
}

Rezultat

mic ca long: 2026
10^20 nu încape în long: BigInteger out of long range
longValue() fără verificare: 7766279631452241920

Greșeli frecvente

  • Folosești long pentru factoriale sau puteri mari. 21! nu mai încape și rezultatul devine greșit fără eroare.
  • Folosești longValue() și crezi că este sigur. Taie biții în plus și dă un număr greșit; folosește longValueExact().

Comenzi înrudite

  • BigInteger.add: Adunare, scădere, înmulțire și împărțire întreagă cu BigInteger, fără depășire.
  • BigInteger.pow: pow ridică la putere (2^100 exact); mod dă restul împărțirii, mereu pozitiv; modPow calculează rapid (a^b) mod m.
  • BigInteger.isProbablePrime: Verifică dacă un număr mare este prim: false înseamnă sigur compus, true înseamnă prim cu probabilitate foarte mare.
  • BigDecimal: Număr zecimal exact, fără erori de rotunjire ca la double; se folosește pentru bani, prețuri și calcule financiare.