2013-07-15 18 views
5

Ben bir döngüde Tahmini kalan süre, ne eksik?

Ben .... benim mantık kusurlu olduğunu düşünüyorum:

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

bu döngü saniyede yaklaşık bir kere günceller ....

Ben sorun yani saniye her zaman sıfır (0) değeriyle biter. ItemPos değeri elapsed.TotalSeconds göre birinci döngü sonra her zaman daha yüksek olduğu için

bu

olup. Yani, örneğin

:

3 saniye yanlış yapıyorum

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

geçirirseniz?

+2

ilk bölümü 0. Cast için işlenen yuvarlama (: sizin ifade

sen tip döküm ertelemek zorunda
((int)(elapsed.TotalSeconds/ItemPos)) * (Count - ItemPos); 

olarak yorumlanır, tek ihtiyacınız () fazladan bir çift olan ilk önce). – EricLaw

+1

@EricLaw: TimeSpan.TotalSeconds bir ' – dtb

+0

@EricLaw double' - ı çözüm ekleyeceğiz ... çok güzel ... –

cevap

6

Tamsayı bölme her zaman bir int döndüren, ve sonuç 0.something olacağını zaman, bir şey gerçek değeri olun 0.

olarak kısaltılıyor, ve iyisin. Veya bölmeden önce çarpın:

int seconds = (int) ((float) geçen .TotalSeconds/ItemPos) * (Count - ItemPos);

veya

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

DÜZENLEME DTB yorumlarına dayanarak

(aşağıya bakınız), ben wrongplace benim typecast koymak biliyoruz. İlk hattım işe yaramayacak (benim ikinci hala olacak). Ne oluyor size totalseconds gelen çift değerini alarak ve bir çift almak için int ItemPos bölünerek olmamız.

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

OP'ın kodunda hiçbir tamsayı bölme (elapsed' bir TimeSpan olan' varsayarak) vardır . Sorun '(int) 'döküm konumudur. – dtb

+2

Eğer negatif olmayan bir "x" ve pozitif bir "y" varsa, x (y), (x) (x/y) her zaman 0 değerini döndürür. int. OP'nin kodundaki sorun bölüm değildir. – dtb

+0

@dtb daha da içinden Düşünce, haklısın. –

8

: Ama o zaman sen Henk Holterman tiplemeleri tüm bölünme bitti, böylece ekstra parantez eklemek zorunda, söylediği gibi o 0'a set olsun nerede bir int, onu yayın yaptığınızdan

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