Comment puis-je obtenir la plus grande valeur possible d'une variable BigDecimal peut contenir? (De préférence par programmation, mais le codage en dur serait également correct)
MODIFIER
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 cela, qui est suffisamment bon pour mon objectif:BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)
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.
En regardant la source, BigDecimal la stocke en tant que BigInteger avec un radix,
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 comprendre comment régler cela. : P
[Modifier] Donc, juste pour calculer cela, en binaire c'est,
(2 ^ 35) -2 1 (je pense?)
en complément de 2
0111111111111111111 ... jusqu'à ce que votre RAM se remplisse.
Avec suffisamment de RAM, la valeur est approximativement:
2240*dix232
(Il est certainement hors de portée de quelques ordres de grandeur, mais en termes relatifs, c'est une estimation très précise.)
Vous pouvez représenter 2 ^ 2147483647-1 mais après cette valeur, certaines méthodes ne fonctionnent pas comme prévu. Il comporte 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 du nombre de bits.
BigDecimal.MAX_VALUE est suffisamment grand pour que vous n'ayez pas besoin de le vérifier.