web-dev-qa-db-fra.com

Pourquoi la division de deux entiers renvoie-t-elle 0,0 en Java?

int totalOptCount = 500;
int totalRespCount=1500; 
float percentage =(float)(totalOptCount/totalRespCount);

Pourquoi cela renvoie-t-il toujours la valeur 0,0? Aussi je veux formater cela au format 00.00 et convertir en chaîne?

48
kiran

Parce que la conversion en float a lieu après la division. Vous avez besoin:

float percentage = ((float) totalOptCount) / totalRespCount;

Vous devriez pouvoir formater en utilisant quelque chose comme:

String str = String.format("%2.02f", percentage);
93
unwind

Si vous utilisez des valeurs int, l'utilisation d'un double peut être un meilleur choix et avoir moins d'erreur d'arrondi. float peut représenter des valeurs int sans erreur jusqu'à ~ 16 millions. double peut représenter avec précision toutes les valeurs de int.

double percentage =(double) totalOptCount / totalRespCount;

Les pourcentages sont généralement multipliés par 100, ce qui signifie que vous pouvez supprimer le plâtre.

double percentage = 100.0 * totalOptCount / totalRespCount;
12
Peter Lawrey

Division entière (qui inclut long, short, byte, char, int) dans Java renvoie toujours un int (ou long, si l'un des paramètres est long), arrondi à zéro. Votre conversion se produit après ce calcul.

(La question de formatage est déjà répondue par les autres réponses - vous pouvez également consulter Java.text.NumberFormat, spécialement Java.text.DecimalFormat.)

3
Paŭlo Ebermann

(totalOptCount/totalRespCount)

ici, le dividende et le diviseur sont de type int ce qui signifie qu'ils n'autoriseront que des valeurs entières et la réponse de cette équation sera toujours un littéral entier.

si je casse ce sera quelque chose comme ci-dessous

(double)(500/1500)

Selon le calcul réel, 500/1500 vous donnera 0,33333 mais le compilateur le convertira en littéral entier car les deux opérandes sont de type int

(double)(0)


Le compilateur reçoit une instruction pour convertir ce 0 valeur à doubler pour obtenir 0.0 à la suite

0.0

puis vous pouvez modifier le résultat dans n'importe quel format tel que suggéré par @Zach Janicki.

gardez à l'esprit si les deux opérandes sont du même type que le résultat sera également du même type.

3
Dheeresh
String.format("%2.02f", (float)totalOptCount/totalRespCount);
1
Dalmas

pour formater un double et imprimer en pourcentage, vous pouvez utiliser

System.out.println(new DecimalFormat("##.##").format(yourDouble) + "%"));
1
Zach Janicki