2010-01-23 9 views
24

J'ai deux entiers que je veux diviser pour obtenir un pourcentage.Quelle est la meilleure façon de créer un pourcentage à partir de deux entiers en C#?

C'est ce que j'ai en ce moment:

int mappedItems = someList.Count(x => x.Value != null); 
int totalItems = someList.Count(); 
(int)(((double)mappedItems /(double) totalItems) * 100) 

Cela donne la bonne réponse. Mais c'est beaucoup de casting pour faire quelque chose d'aussi simple que d'obtenir un pourcentage entre deux nombres.

Y a-t-il une meilleure façon de procéder? Quelque chose qui n'implique pas de casting?

+0

Merci pour les bonnes réponses! Des votes tout autour! – Vaccano

Répondre

42

Que diriez-vous juste de mappedItems * 100.0/totalItems et de mouler ceci au type approprié?

+9

Faites attention à la division par 0 si la liste est vide. –

+2

ou ajoutez un suffixe 'M' comme' * 100M'. –

+0

La solution d'origine prend en compte les valeurs de mappedItems dans la plage complète (Int32.MaxValue/Int32.MinValue). Votre solution provoquera un débordement pour les valeurs> (Int32.MaxValue/100) ou <(Int32.MinValue/100) –

1

Vous pouvez utiliser (mappedItems * 100)/totalItems mais cela s'arrêtera toujours. La méthode que vous avez utilisée est meilleure. Pourquoi ne pas envelopper le code comme une méthode?

+0

La suggestion de John est meilleure. – Mick

4

Eh bien, en supposant que votre compte sont plus petits que Int.MaxValue:

int percent = mappedItems * 100/totalItems; 
7

Si vous voulez juste pour éviter les moulages, vous pourriez écrire:

(100 * mappedItems)/totalItems 

mais débordera rapidement lorsque mappedItems > int.MaxValue/100 .

Et les deux méthodes arrondissent le pourcentage à la baisse. Pour obtenir arrondi correct, je garderais le résultat en double:

((double)mappedItems /(double) totalItems) * 100 
6

Vous pouvez obtenir un résultat correctement arrondi en utilisant uniquement des opérations entières:

int percent = (200 * mappedItems + 1)/(totalItems * 2); 

Par multiplyingby deux, en ajoutant une et en divisant par deux , vous ajoutez effectivement une moitié. Cela rend la division entière arrondie au lieu de tronquer.

+2

Votre formule n'est pas correcte et ne fonctionne pas. Voir ma réponse pour la bonne formule et les explications. – dragonroot

1

Juste pour ajouter que vous avez int s et que vous voulez calculer le pourcentage (une valeur de virgule flottante) que vous allez ont à faire casting. Que ce soit explicite comme en C# ou implicite comme dans certains langages de script, la distribution sera toujours possible. Il vaut mieux le rendre explicite.

Si vous voulez moins de lancers par ligne de code, vous pouvez écrire:

double mappedItems = (double)someList.Count(x => x.Value != null); 
double totalItems = (double)someList.Count(); 
double percentage = (mappedItems/totalItems) * 100.0); 

Bien que d'autres ont fait remarquer - vérifier totalItems être 0 (de préférence avant la coulée de doubler) afin d'éviter une division par zéro.

1

essayez ceci:

int mappedItems = someList.Count(x => x.Value != null); 
int totalItems = someList.Count(); 
int percent = Convert.ToInt32(complete * 100.0/total); 

dans cet exemple, vous obtiendrez résultat étant "50"

int mappedItems = 14; 
int totalItems = 28; 
int result = Convert.ToInt32(mappedItems * 100.0/totalItems); 
// result is 50 
8

Le droit seul entier moyen d'obtenir le pourcentage avec arrondi correct est:

int result = (mappedItems * 200 + totalItems)/(totalItems * 2); 

Comment y aller?Si nous faisons cette chose en virgule flottante, ce serait Math.Floor(mappedItems * 100.0/totalItems + 0.5). Nous devons transformer cette formule en entier uniquement en multipliant et en divisant 0,5 par totalItems, puis en divisant 0,5 * totalItems par dividende, puis en multipliant dividende et diviseur par 2 pour éliminer les fractions:

mappedItems * 100.0/totalItems + 0.5 => mappedItems * 100.0/totalItems + totalItems * 0.5/totalItems => (mappedItems * 100.0 + 0.5 * totalItems)/totalItems => (mappedItems * 200.0 + totalItems)/(totalItems * 2).

À ce stade, la formule est entière seulement. Quand nous faisons une division entière, nous obtenons un résultat plancher, de sorte que le résultat entier-entier est équivalent au résultat en virgule flottante mentionné.

Questions connexes