BigInt în Dart

Numere întregi oricât de mari, fără depășire; BigInt.from transformă un int, BigInt.one este valoarea 1.

Sintaxă
static BigInt from(num value)
static BigInt get zero, one, two
// operatori: + - * ~/ % < > == ...

Ce face BigInt

Un int are 64 de biți pe platformele native: cel mai mare este 9223372036854775807. Peste această limită valoarea „se întoarce” la numere negative (depășire). BigInt nu are limită: poate ține 100! sau 21000, cu toate cifrele exacte.

Creezi valori cu BigInt.from(int) (dintr-un double, zecimalele se taie), cu BigInt.parse dintr-un text, sau folosești constantele BigInt.zero, BigInt.one, BigInt.two. Operatorii sunt cei obișnuiți (+, -, *, ~/, %, comparații), dar ambii operanzi trebuie să fie BigInt.

Calculele cu BigInt sunt mai lente decât cu int. Folosește-l doar când numerele pot depăși limita: factoriale, criptografie, identificatori foarte mari. Înapoi la int mergi cu toInt(), după ce verifici isValidInt.

Parametri

Parametru Descriere
value La from: numărul convertit.

Ce returnează

Un BigInt.

Exemple

Exemplul 1: Depășirea lui int față de BigInt

void main() {
  var maxInt = 9223372036854775807;
  print(maxInt + 1);
  var mare = BigInt.from(maxInt) + BigInt.one;
  print(mare);
  print(BigInt.from(7.9));
  print(BigInt.two * BigInt.from(21));
  print(mare.isValidInt);
  print(BigInt.from(1000).toInt() + 1);
}

Rezultat

-9223372036854775808
9223372036854775808
7
42
false
1001

Exemplul 2: Factorialul lui 30

BigInt factorial(int n) {
  var rezultat = BigInt.one;
  for (var i = 2; i <= n; i++) {
    rezultat *= BigInt.from(i);
  }
  return rezultat;
}

int factorialInt(int n) {
  var r = 1;
  for (var i = 2; i <= n; i++) {
    r *= i;
  }
  return r;
}

void main() {
  print('30! = ${factorial(30)}');
  print('cu int: ${factorialInt(30)}');
  print('cifre: ${factorial(30).toString().length}');
  print(factorial(30) % BigInt.from(1000000007));
}

Rezultat

30! = 265252859812191058636308480000000
cu int: -8764578968847253504
cifre: 33
109361473

Greșeli frecvente

  • Combini BigInt cu int: mare + 1 nu compilează. Scrie mare + BigInt.one sau mare + BigInt.from(1).
  • Folosești /: rezultatul este double și pierzi precizia. Pentru împărțire întreagă folosește ~/.

Comenzi înrudite

  • BigInt.parse: Transformă un text cu cifre, oricât de lung, într-un BigInt; acceptă și alte baze (radix) și prefixul 0x.
  • BigInt.pow: Ridică un BigInt la o putere întreagă, cu rezultat exact; modPow calculează puterea modulo un număr.
  • int: Tipul pentru numere întregi (fără zecimale): vârste, cantități, note, indici.
  • int.gcd: gcd dă cel mai mare divizor comun; modPow calculează (n la puterea e) modulo m, fără depășire.