2010-09-04 21 views
9

Sto provando a calcolare la percentuale di qualcosa. È semplice matematica. Ecco il codice.Il calcolo percentuale restituisce sempre 0

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

Qui il valore del todaysCollection è il 1751 e il 4000. totalCollectionAvailable è Entrambi sono int. Ma percentComplete mostra sempre 0. Perché sta succedendo questo? Qualcuno mi può aiutare. Sono nuovo di Objective C.

+0

per cominciare, penso che si dovrebbe verificare il divisore per lo zero! –

+0

@Mitch Wheat: Non sarebbe il risultato in NaN? –

+0

ma il divisore è già 4000, "totalCollectionAvailable è 4000" – vodkhang

risposta

0

Forse provare con * (float) 100, a volte questo è il problema;)

+3

Probabilmente no, dato che solo uno degli operandi deve essere un float perché l'espressione possa essere valutata come un float (grazie a implicita casting). Questa è solo la mia deduzione intelligente, però. – BoltClock

+0

Non so esattamente come appare in obj-c ma in C# ho avuto un problema simile con quello. (float)/(float) può essere lanciato su (int) prima *. – cichy

+0

float/float è sempre di tipo float –

1

Credo che il rapporto qualità-todaysCollection e totalCollectionAvailable è sbagliato. Doppio controllo per quello.

Mettere il NSLog(@"%d", todaysCollection) destra prima del if

11

Ma percentComplete mostra sempre 0

Come stai visualizzando percentComplete? Ricorda che è un float - se lo interpreti come un int senza lanciarlo otterrai l'output sbagliato. Ad esempio, questo:

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 

Risulterà:

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 

Tenete a mente che lanciare un valore in virgola mobile a un tipo intero solo scarta la roba dopo la virgola - così nel mio esempio 43,8 rende come 43. per arrotondare il valore virgola mobile per l'utilizzo intero più vicino una delle funzioni di arrotondamento da math.h, ad esempio:

#import <math.h> 

... rest of code here 

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

Perfetto, fantastico, grazie, ti amo! Questa è la risposta corretta. =) – RanLearns

Problemi correlati