2010-09-15 9 views
4
int cinema,dvd,pc,total; 
double fractionCinema, fractionOther; 
fractionCinema=(cinema/total)*100; //percent cinema 

Donc, quand je cours du code pour afficher fractionCinema, il me donne juste des zéros. Si je change tous les nombres en doubles, alors cela me donne ce que je cherche. Cependant, j'utilise le cinéma, le pc et le total ailleurs et ils doivent être affichés en tant qu'ints, pas en nombres décimaux. Que fais-je?Débutants Java Question (int, float)

+0

Voir [ Java Integer Division, Comment produire un double? ] (http://stackoverflow.com/questions/3144610/java-integer-division-how-do-you-produce-a-double). –

+0

Nitpick d'une expérience difficile: ne l'appelez pas "fractionCinema" quand c'est vraiment "percentCinema". Fait du soutien un an plus tard très confus! – user949300

Répondre

13

Lorsque vous divisez deux nombres entiers (par exemple 2/3), Java exécute une division entière et tronque la partie décimale.
Par conséquent, 2/3 == 0.

Vous devez forcer Java à exécuter une division double en convertissant l'un ou l'autre des opérandes en double.

Par exemple:

fractionCinema = (cinema/(double)total) * 100; 
+0

Il n'est pas nécessaire de forcer l'arithmétique à virgule flottante, d'autant plus que OP dit qu'il n'en a pas besoin dans l'affichage final. Voir ma réponse pour une solution entière seulement. –

2

Lorsque vous divisez deux int s, Java fera la division entière et la partie décimale est tronquée.

Vous pouvez convertir explicitement l'un des arguments à une double via cinema/(double) total ou en utilisant implicitement une opération telle que cinema*1.0/total

+1

Ce dernier ne fonctionnera pas en raison de l'ordre des opérations. –

+0

@ Matthew Bonne capture – NullUserException

+1

IMHO, le deuxième exemple, '* 1.0» qui force une multiplication simplement pour convertir le type en double, est une odeur de code. Mieux vaut écrire du code qui clarifie votre intention. "ceci doit être converti en type double" est votre intention. Utilisez '(double)' - c'est pour ça. RAISON: Quelqu'un d'autre pourrait facilement venir, voir une multiplication par 1.0, et penser "c'est une multiplication gaspillée, je vais l'enlever". Vous * pourriez * ajouter un commentaire à la ligne de code: '//" * 1.0 "est à convertir en double'. Mais ce serait idiot, quand l'opérateur désiré existe déjà. – ToolmakerSteve

5

Essayez ceci:

int cinema, total; 
int fractionCinema; 

fractionCinema = cinema*100/total; //percent cinema 

Par exemple, si cinema/(double)total est de 0,5, puis fractionCinema serait 50. Et aucune opération à virgule flottante n'est requise; tout le calcul est fait en utilisant l'arithmétique entière.

Addendum

Comme l'a souligné @ user949300, le code ci-dessus arrondit vers le bas à l'entier le plus proche. Pour arrondir le résultat « correctement », utilisez ceci:

fractionCinema = (cinema*100 + 50)/total; //percent cinema 
+0

En supposant que l'OP voulait seulement les valeurs entières, c'est la meilleure réponse. ("J'utilise le cinéma, le pc, et le total ailleurs et ils doivent être _displayed_ _as_ _ints_, pas des nombres décimaux.") – qben

+0

L'inconvénient mineur est que le résultat est toujours arrondi vers le bas.La solution à virgule flottante est, IMO, meilleure car elle arrondira de manière "normale". Aussi, nitpick, "fractionCinema" devrait être nommé "percentCinema". – user949300

0

Comme certaines personnes ont déjà dit, Java coupera automatiquement toutes les fractions lorsque vous faites division des nombres entiers. Changez simplement les variables de int pour doubler.