2013-07-15 16 views
5

Penso che la mia logica è viziata ....Tempo rimanente stimato, cosa mi manca?

in un ciclo che ho:

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

questo ciclo aggiorna circa una volta al secondo ....

il problema che ho è che i secondi finiscono sempre con un valore zero (0).

perché il valore ItemPos è sempre più alto dopo il primo ciclo rispetto a elapsed.TotalSeconds.

Così, per esempio:

se 3 secondi passano

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

Che cosa sto facendo di sbagliato?

+2

la tua prima divisione è arrotondamento a 0. Fusioni operandi a (float) prima. – EricLaw

+1

@EricLaw: TimeSpan.TotalSeconds è un 'double' – dtb

+0

@EricLaw - molto bello ... Aggiungerò la soluzione ... –

risposta

6

divisione interi restituisce sempre un int, e quando il risultato sarebbe 0.something, è troncando a 0.

fare qualcosa di un valore reale, e che stai bene. Oppure moltiplicare prima di dividere:

int secondi = (int) ((float) trascorso.TotalSeconds/ItemPos) * (Count - ItemPos);

(vedi sotto)

o

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

EDIT

Sulla base di commenti di DTB, mi rendo conto che ho messo la mia typecast nel wrongplace. La mia prima linea non funzionerà (anche se il mio secondo lo farà ancora). Quello che sta succedendo è che stai prendendo il doppio valore da TotalSeconds e dividendolo per int ItemPos per ottenere un doppio. Ma allora si sta gettando a un int, che è dove si ottiene impostato a 0. Come Henk Holterman detto, si deve aggiungere la parentesi in più, in modo che il typecasting è finita l'intera divisione:

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

Non c'è una divisione intera nel codice dell'OP (presupponendo che' trascorso 'sia un TimeSpan) . Il problema è la posizione del cast '(int)'. – dtb

+2

Se si ha un 'x' non negativo e un positivo' y' dove 'x dtb

+0

@dtb Pensato oltre, hai ragione. –

8

la vostra espressione viene interpretata come

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

bisogna ritardare il tipo-cast, tutto ciò che serve è un paio di ():

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