54 votes

Comment obtenir la plus grande valeur BigDecimal

Comment puis-je obtenir la plus grande valeur possible d'une variable BigDecimal ? (De préférence par programmation, mais le codage en dur serait également acceptable)

ÉDITER OK, je viens de réaliser qu'il n'y a rien de tel puisque BigDecimal est une précision arbitraire. Je me suis donc retrouvé avec ceci, qui est suffisamment gros pour mon objectif : BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)

57voto

alexblum Points 1342

C'est une classe de précision arbitraire, elle deviendra aussi grande que vous le souhaitez jusqu'à ce que votre ordinateur manque de mémoire.

14voto

Andrew Points 8248

En regardant la source, BigDecimal le stocke en tant que BigInteger avec une base,

 private BigInteger intVal;
private int scale;

et de BigInteger

 /** All integers are stored in 2's-complement form.
63:    * If words == null, the ival is the value of this BigInteger.
64:    * Otherwise, the first ival elements of words make the value
65:    * of this BigInteger, stored in little-endian order, 2's-complement form. */
66:   private transient int ival;
67:   private transient int[] words;

Donc, le plus grand BigDecimal serait,

 ival = Integer.MAX_VALUE;
words = new int[Integer.MAX_VALUE]; 
scale = 0;

Vous pouvez trouver comment régler cela. :P

[Modifier] Donc juste pour calculer ça, En binaire c'est,

(2^35)-2 1 (je pense ?)

en complément à 2

01111111111111111...jusqu'à ce que votre RAM se remplisse.

13voto

biziclop Points 21446

Avec suffisamment de RAM, la valeur est d'environ :

2 2 40 *10 2 32

(C'est certainement en dehors de quelques ordres de grandeur, mais en termes relatifs, c'est une estimation très précise.)

11voto

Peter Lawrey Points 229686

Vous pouvez représenter 2^2147483647-1, mais après cette valeur, certaines méthodes ne fonctionnent pas comme prévu. Il a 646456993 chiffres.

 System.out.println(BigInteger.ONE.shiftLeft(Integer.MAX_VALUE)
                                 .subtract(BigInteger.ONE).bitLength());

impressions

 2147483647

toutefois

 System.out.println(BigInteger.ONE.shiftLeft(Integer.MAX_VALUE).bitLength());

impressions

 -2147483648

car il y a un débordement dans le nombre de bits.

BigDecimal.MAX_VALUE est suffisamment grand pour que vous n'ayez pas besoin de le vérifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X