2010-09-04 6 views
9

J'essaie de calculer le pourcentage de quelque chose. C'est mathématique simple. Voici le code.Le calcul du pourcentage renvoie toujours 0

float percentComplete = 0; 
if (todaysCollection>0) { 
    percentComplete = ((float)todaysCollection/(float)totalCollectionAvailable)*100; 
} 

Ici, la valeur de todaysCollection est 1751 et totalCollectionAvailable est 4000. Les deux sont int. Mais percentComplete affiche toujours 0. Pourquoi cela se produit-il? Quelqu'un peut m'aider. Je suis nouveau à l'objectif C.

+0

pour commencer, je pense que vous devriez tester le diviseur zéro! –

+0

@Mitch Wheat: Cela ne se traduirait-il pas par NaN? –

+0

mais le diviseur déjà 4000, "totalCollectionAvailable is 4000" – vodkhang

Répondre

0

Peut-être essayer avec * (float) 100, parfois c'est le problème;)

+3

Très probablement pas, car un seul des opérandes doit être un flottant pour que l'expression puisse être évaluée comme un flottant (grâce à l'implicite fonderie). C'est juste ma déduction intelligente, cependant. – BoltClock

+0

Je ne sais pas exactement à quoi ça ressemble dans obj-c mais en C# j'ai eu un problème similaire avec ça. (float)/(float) peut être casté en (int) avant *. – cichy

+0

float/float est toujours de type float –

1

Je pense que votre valeur pour todaysCollection et totalCollectionAvailable est erroné. Double vérifier pour cela.

Mettre le NSLog(@"%d", todaysCollection) juste avant l'instruction if

11

Mais percentComplete montre toujours 0

Comment affichiez percentComplete vous? Gardez à l'esprit que c'est un float - si vous l'interprétez comme un int sans le lancer, vous obtiendrez la mauvaise sortie. Par exemple, ceci:

int x = 1750; 
int y = 4000; 
float result = 0; 
if (x > 0) { 
    result = ((float)x/(float)y)*100; 
} 
NSLog(@"[SW] %0.1f", result); // interpret as a float - correct 
NSLog(@"[SW] %i", result);  // interpret as an int without casting - WRONG! 
NSLog(@"[SW] %i", (int)result); // interpret as an int with casting - correct 

Sorties ceci:

2010-09-04 09:41:14.966 Test[6619:207] [SW] 43.8 
2010-09-04 09:41:14.967 Test[6619:207] [SW] 0 
2010-09-04 09:41:14.967 Test[6619:207] [SW] 43 

Gardez à l'esprit que la coulée d'une valeur à virgule flottante à un type entier défausse juste les choses après la virgule - donc dans mon exemple 43,8 rend comme 43. pour arrondir la valeur en virgule flottante au plus proche usage entier l'une des fonctions d'arrondissement de math.h, par exemple:

#import <math.h> 

... rest of code here 

NSLog(@"[SW] %i", (int)round(result)); // now prints 44 
+0

Parfait, génial, merci, je t'aime! C'est la bonne réponse. =) – RanLearns

Questions connexes