2013-07-15 20 views
5

我覺得我的邏輯是有缺陷的....預計剩餘時間,我錯過了什麼?

在一個循環

我:

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

這個循環更新大約每秒一次....

我的問題是,秒總是以零(0)值結束。

這是因爲在第一次循環後ItemPos值總是比elapsed.TotalSeconds高。

因此,例如:

如果3個秒鐘過去了

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

我在做什麼錯?

+2

你的第一部被四捨五入爲0演員的操作數(浮動)。 – EricLaw

+1

@EricLaw:TimeSpan.TotalSeconds是一個'double' – dtb

+0

@EricLaw - 非常好...我會添加解決方案... –

回答

6

整數除法總是返回一個int,當你的結果將是0.something,它截斷爲0

使一些真正的價值,你的罰款。或者,除以前的乘積:

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

(見下文)

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

編輯

基於DTB的評論,我意識到我把我的類型轉換的wrongplace。我的第一行不行(雖然我的第二行仍然會)。發生了什麼事是你從TotalSeconds中取得了雙倍的價值,並將它除以int ItemPos以獲得雙倍的價值。但此時你就鑄造爲int,這就是你得到它設置爲0亨克Holterman說,你必須添加額外的括號,使鑄字在整個分工:

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

OP代碼中沒有整數除法(假設'elapsed'是TimeSpan) 。問題是'(int)'cast的位置。 – dtb

+2

如果你有一個非負數的'x'和一個正數'y',其中'x dtb

+0

@dtb深思熟慮,你是對的。 –

8

你的表達被解釋爲

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

你不得不推遲型鑄造,所有你需要的是一個額外的一雙()

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