Tout d'abord, vous devez vérifier votre livre de texte physique/chimie.
Le numéro d'Avogadro n'est pas 602,200,000,000,000,000,000,000. C'est environ 6,022 x 10 . Le mot clé est "approximativement". Le nombre est une valeur mesurée empiriquement.
(Selon Wikipedia, la meilleure approximation courante est 6,022140857 (74) x 10 mol-1, et l'erreur relative est de 1,2 +/- × 10 -8 .)
Étant donné que le nombre n'est connu qu'avec une précision d'environ 8 décimales, le type Java double
est un type approprié pour le représenter.Par conséquent, j'utiliser
final double AVOGADROS_CONSTANT = 6.02214085774E23;
De toute évidence, ni int
ou long
peut représenter ce nombre. Un float
pourrait, mais pas avec assez de précision (en supposant que nous utilisons la meilleure valeur mesurée disponible). BigInteger
est une possibilité, mais elle est conceptuellement erronée car nous n'avons pas de valeur entière exacte pour la constante.
maintenant à vos problèmes apparents avec la déclaration constante (diversement) un double
, un long
et un BigInteger
.
Je pense que vous avez fait quelque chose comme ceci:
double a = 602200000000000000000000;
et ainsi de suite. Cela ne va pas fonctionner, mais la raison pour laquelle cela ne fonctionnera pas doit être expliquée. Le problème est que le nombre est fourni en tant que littéral int
. Un int
ne peut pas être si gros. La plus grande valeur possible int
est 2 - 1 ... qui est un peu plus grande que 2 x 10 .
C'est ce dont se plaignait le compilateur Java. Le littéral est trop grand pour être un int
.
Il est trop grand pour long
littéral aussi bien. (Faites le calcul.)
Mais ce n'est pas trop grand pour un littéral double
... à condition que vous l'écrivez correctement.
La solution utilisant BigInteger(String)
fonctionne car elle contourne le problème de représentation du nombre en tant que littéral numérique en utilisant une chaîne à la place et en l'analysant au moment de l'exécution. C'est OK du point de vue de la langue, mais (IMO) faux parce que la précision supplémentaire est une illusion.
Si BigInteger dit trop grand, vous devez installer plus de RAM. – csmckelvey
Le problème n'est probablement pas BigInteger. Un entier de cette taille peut être représenté dans environ 80 bits. Même en tenant compte des autres frais généraux de mise en œuvre, BigInteger le supportera sans problème. Le problème est probablement de savoir comment l'OP essaie de faire l'initialisation. – Peter
À l'avenir, au lieu de dire "il est toujours trop grand", il suffit de copier-coller le message d'erreur exact que vous voyez. Pour moi, le compilateur dit 'nombre entier trop grand: 602200000000000000000000'. –