Division longue en Java ne fonctionne pas comme prévu
class LongDiv{
public static void main(String [] args){
final long x = 24*60*60*1000*1000;
final long y = 24*60*60*1000;
System.out.println(x/y);
}
}
bien que la réponse attendue est de 1000, mais la javac donne comme 5. La raison?
OriginalL'auteur Aakash Goel | 2011-07-20
Vous devez vous connecter pour publier un commentaire.
Le long
x
de la création n'est pas la valeur que vous avez prévu. C'est dans l'intervalle entier. Pour créer longs, utilisation:La
x
vous calculée, dans l'intervalle entier, a été500654080
. Cette divisée par lay
( =86400000
), les résultats de5.794607407407407...
. Java tronque la partie décimale qui provoque l'5.Par l'ajout d'une
L
après le nombre littéral, vous dire au compilateur pour compiler en tant quelong
au lieu d'uneint
. La valeur dex
vous attend est86400000000
. Mais est a été compilé comme un int.Nous pouvons reproduire la mauvaise valeur pour
x
(500654080
) en tronquant à int:long
. Voir @la réponse de Pierre.accepté. mais quelle est la réponse 5?
Je sais, mais je pense que c'est un style de préférence.
comment puis-je calculer cette valeur 500654080 sans ordinateur!! cette question est apparue dans un examen écrit!!
C'est une question assez cruel écrite de l'examen de la question... Le mieux je pense serait d'écrire les bits de chaque numéro et d'un masque avec 0xFFFFFFFF, comme @Pierre fait allusion ci-dessus.
OriginalL'auteur Martijn Courteaux
Les expressions
24*60*60*1000*1000
est unint
type pas unlong
Ce que vous voulez est24L*60*60*1000*1000
qui estlong
C'est ce que vous avez.
ce que vous voulez est
1L * 24 * 60 * 60 * 1000 * 1000
.Dans ce cas, vous pourriez faire
(long) 24 * 60 * 60 * 1000 * 1000
Quand le int->promotion d'arriver? Pour 24 ou de la totalité (intified) résultat?
la coulée a préséance sur la multiplication de introcs.cs.princeton.edu/java/11precedence
OriginalL'auteur Peter Lawrey
Difficile!
Le problème est que 24, 60 et 1000 sont Java littérale ints. Avant les valeurs sont affectées à x et y, ils sont tronqués dans les valeurs int. Essayez
pour voir exactement ce que je veux dire. La solution rapide est de faire de votre littéraux en valeurs longues comme suit:
OriginalL'auteur Eric
casting (forcer) à des œuvres de longue durée dans le cas de valeurs littérales de l'opérande de droite; mais le problème persiste en cas d'affectation d'une variable de type long à l'autre, comme dans l'exemple donné ci-dessous:
La seule façon que j'ai pu obtenir la bonne réponse est par la conversion de la division de la nostalgie de la division de doubles. Il est très étrange que la division de la nostalgie se comporte de manière mystérieuse.
longDivision donne la réponse à zéro alors que le doubleDivision donne la bonne réponse.
J'espère que cela aide d'autres personnes qui ont rencontré des problèmes similaires...
OriginalL'auteur Saasira
24*60*60*1000*1000
est trop grand pour tenir dans uneint
et les débordements.OriginalL'auteur matt b