web-dev-qa-db-fra.com

Quel type de variable puis-je utiliser pour contenir des nombres énormes (plus de 30 chiffres) en java?

Existe-t-il un type de variable vraiment volumineux que je peux utiliser en Java pour stocker des nombres énormes (jusqu'à une quarantaine de chiffres)?

La valeur maximale de long est 9223372036854775807, soit 19 chiffres - pas assez grande. 

J'essaie de créer une calculatrice capable de gérer des nombres élevés, car la plupart des ordinateurs actuels ne peuvent contenir que 10 chiffres ou plus, et je veux des calculs précis avec des nombres d'une ampleur beaucoup plus grande.

MODIFIER

Merci pour les réponses. Je peux utiliser BigInteger pour les grands entiers, la seule limite étant la mémoire de l'ordinateur (devrait suffire). Pour les nombres décimaux, je vais utiliser float ^ e, comme suggéré par @WebDaldo, ou BigDecimal (semblable à BigInteger), comme suggéré par @kocko.

15
Jonathan Lam

Vous pouvez utiliser BigInteger class.

BigInteger bi1 = new BigInteger("637824629384623845238423545642384"); 
BigInteger bi2 = new BigInteger("3039768898793547264523745379249934"); 

BigInteger bigSum = bi1.add(bi2);

BigInteger bigProduct = bi1.multiply(bi2);

System.out.println("Sum : " + bigSum);
System.out.println("Product : " + bigProduct);

Sortie:

Somme: 3677593528178171109762168924892318 

Produit: 1938839471287900434078965247064711159607977007048190357000119602656

Je devrais mentionner BigDecimal , qui est excellent pour les calculs de montant comparé à double.

BigDecimal bd = new BigDecimal("123234545.4767");
BigDecimal displayVal = bd.setScale(2, RoundingMode.HALF_EVEN);

NumberFormat usdFormat = NumberFormat.getCurrencyInstance(Locale.US);        
System.out.println(usdFormat.format(displayVal.doubleValue()));

Sortie:

123 234 545,48 $

20
Sajal Dutta

Vous pouvez essayer d’utiliser la classe BigInteger pour les opérations avec des nombres entiers vraiment énormes.

Pour les opérations avec des nombres flottants, Java fournit la classe BigDecimal , qui peut également être utile.

11
Konstantin Yovkov

Pour les calculs avec des exposants, comme vous le feriez dans une calculatrice, vous devriez utiliser BigDecimal. Le problème avec BigInteger est qu’il ne gère que les entiers (pas de nombres fractionnaires) et que, pour les très gros nombres comme 10 ^ 100, il stocke tous les zéros en utilisant beaucoup de mémoire, au lieu d’utiliser un format basé sur la notation scientifique.

Vous pouvez également utiliser le type de nombre à virgule flottante double, qui vous donne une large plage de valeurs, une faible utilisation de la mémoire et des opérations rapides. Mais à cause des problèmes d'arrondis et de la précision limitée (environ 16 chiffres décimaux), je ne recommanderais pas de l'utiliser si vous ne savez pas vraiment ce que vous faites.

4
Joni

Vous pouvez utiliser float ^ e

afin que vous puissiez avoir

0.55342663552772737682136182736127836782163 * 10^e

Les calculatrices sont surtout utilisées.

2
JavaDM

Ceci est valable pour tous les grands nombres au-dessus de 15, car l'utilisation d'Int le souffle. Vous voudrez peut-être trouver la factorielle de 50 ou 100 ou 500.

// Recursive version of the Fat factorial for bigger numbers ex: Factorial of 500     
BigInteger fatFactorial(int b) {
    if (BigInteger.ONE.equals(BigInteger.valueOf(b))
        || BigInteger.ZERO.equals(BigInteger.valueOf(b))) {
            return BigInteger.ONE;
    } else {
        return BigInteger.valueOf(b).multiply(fatFactorial(b - 1));
        }
    }
1
kamals1986