2010-09-04 25 views
9

Próbuję obliczyć procent czegoś. To proste matematyki. Oto kod.Obliczanie procentowe zawsze zwraca 0

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

Tutaj wartość dzisiejszychKolekcja wynosi 1751, a całkowitaKolekcjaDostępna 4000. Oba to int. Ale percentComplete zawsze pokazuje 0. Dlaczego tak się dzieje? Czy ktoś może mi pomóc? Jestem nowy Objective C

+0

na początek, myślę, że należy przetestować dzielnik do zera! –

+0

@Mitch Wheat: Czy to nie wpłynęłoby na NaN? –

+0

ale dzielnik ma już 4000, "totalCollectionAvailable is 4000" – vodkhang

Odpowiedz

0

Może spróbuj * (float) 100, czasami to jest problem;)

+3

Najprawdopodobniej nie, ponieważ tylko jeden z operandów musi być zmiennoprzecinkowy, aby wyrażenie mogło być ocenione jako zmiennoprzecinkowe (dzięki niejawnym odlew). To tylko moja inteligentna dedukcja. – BoltClock

+0

Nie wiem dokładnie, jak to wygląda w obj-c, ale w C# miałem podobny problem z tym. (float)/(float) można odlać na (int) przed *. – cichy

+0

float/float jest zawsze typu float –

1

Myślę, że stosunek jakości do todaysCollection i totalCollectionAvailable jest źle. Sprawdź dwukrotnie.

Umieść NSLog(@"%d", todaysCollection) tuż przed if

11

Ale percentComplete zawsze pokazuje 0

Jak ty wyświetlania PERCENTCOMPLETE? Pamiętaj, że jest to float - jeśli zinterpretujesz to jako int bez rzucania, otrzymasz nieprawidłowy wynik. Na przykład w ten sposób:

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 

Wyjścia to:

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 

Należy pamiętać, że rzucając wartość zmiennoprzecinkową do typu całkowitego prostu odrzuca rzeczy po przecinku - tak w moim przykładzie 43.8 renderuje jako 43. aby zaokrąglić wartość zmiennoprzecinkową do najbliższej liczby całkowitej wykorzystania jednej z funkcji zaokrąglania z math.h, np:

#import <math.h> 

... rest of code here 

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

Idealne, niesamowite, dziękuję, kocham cię! To jest poprawna odpowiedź. =) – RanLearns

Powiązane problemy