2013-07-15 6 views
5

私は私のロジックは欠陥があると思います....残り時間の見積もりは何ですか?

私が持っているループ内

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

このループは約1秒に1回更新されます....

私が持っている問題があることです秒は常にゼロ(0)の値で終わります。

elapsed.TotalSecondsよりも最初のループの後で常にItemPosの値が高いためです。ですから、例えば

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); 

EDIT DTBのコメントに基づいて

(下記参照)、私はwrongplaceで私の型キャストを入れて実現しています。私の最初の行は動作しません(私の2番目はまだ)。何が起こっているのかは、TotalSecondsから二倍の値をとり、それを二重にするためにint ItemPosで割ったものです。しかし、その後、あなたは型キャストは、部門全体の上にあるようにあなたは、余分な括弧を追加する必要があり、あなたはヘンクHoltermanが言ったように、それが0に設定され得るところであるint型、それをキャストしている:

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

OPのコードに整数の除算はありません(' elapsed'はTimeSpanであると仮定します) 。問題は '(int)'キャストの位置です。 – dtb

+2

'x'が' double'、 'float'、' 'double''のいずれであっても'(x/y) 'は常に0を返します。 int。 OPのコードの問題は、部門ではありません。 – 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)); 
関連する問題