2013-07-15 16 views
5

myślę, że moja logika jest błędna ....Szacowany pozostały czas, czego brakuje?

w pętli mam:

int seconds = (int) (elapsed.TotalSeconds/ItemPos) * (Count - ItemPos); 

ta pętla aktualizuje mniej więcej raz na sekundę ....

Mam problem jest, że sekundy zawsze kończą się wartością zerową (0).

dzieje się tak, ponieważ wartość ItemPos jest zawsze wyższa po pierwszej pętli niż elapsed.TotalSeconds.

Tak na przykład:

czy 3 sekundy mijają

ItemCount = 20 , so 3/20 = 0.15 - rounds to zero.... 0 * anything = 0...... 

Co robię źle?

+2

Twój pierwszy podział jest zaokrąglanie do 0. oddanych operandy (float). – EricLaw

+1

@EricLaw: TimeSpan.TotalSeconds jest "podwójnym" – dtb

+0

@EricLaw - bardzo ładnym ... Dodam rozwiązanie ... –

Odpowiedz

6

Integer podział zawsze zwraca int, i gdy wynik będzie 0.something, to obcinanie 0.

coś zrobić prawdziwą wartość, a ty jesteś w porządku. Lub pomnóż przed dzieleniem:

int seconds = (int) ((float) upłynął.TotalSeconds/ItemPos) * (Count - ItemPos);

(patrz poniżej)

lub

int seconds = (int) (elapsed.TotalSeconds * (Count - ItemPos)/ItemPos); 

EDIT

podstawie wypowiedzi DTB jest, zdaję sobie sprawę Kładę typecast w wrongplace. Moja pierwsza linia nie zadziała (chociaż moja druga nadal będzie). Co się dzieje, to bierzesz podwójną wartość z TotalSeconds i dzieląc ją przez int ItemPos, aby uzyskać podwójne. Ale wtedy jesteś rzucając go na int, czyli tam, gdzie masz to ustawione na 0. Jak powiedział Henk Holterman, trzeba dodać dodatkowy nawias, tak że typecasting jest na całej dywizji:

int seconds = (int) ((elapsed.TotalSeconds/ItemPos) * (Count - ItemPos)); 
+2

Nie ma podziału na liczby całkowite w kodzie OP (zakładając, że "upłynął" jest TimeSpan) . Problem polega na położeniu rzutu "(int)". – dtb

+2

Jeśli masz nieujemne "x" i pozytywne "y", gdzie 'x dtb

+0

@dtb Pomyślałem o tym dalej, masz rację. –

8

Twoja ekspresja jest interpretowany jako

((int)(elapsed.TotalSeconds/ItemPos)) * (Count - ItemPos); 

trzeba opóźnić typu obsady, wszystko czego potrzebujesz to dodatkowa para ():

//int seconds = (int) (elapsed.TotalSeconds/ItemPos) * (Count - ItemPos) ; 
    int seconds = (int) ((elapsed.TotalSeconds/ItemPos) * (Count - ItemPos)); 
Powiązane problemy