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......

我究竟做错了什么?

4

2 回答 2

8

你的表达被解释为

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

您必须延迟类型转换,您只需要一对额外的()

 //int seconds = (int)   (elapsed.TotalSeconds / ItemPos) * (Count - ItemPos)  ;
   int seconds = (int) ( (elapsed.TotalSeconds / ItemPos) * (Count - ItemPos) );
于 2013-07-15T16:26:32.100 回答
6

整数除法总是返回一个 int,当你的结果是 0.something 时,它会被截断为 0。

让某些东西成为真正的价值,你就没事了。或者,在除法之前相乘:

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

(见下文)

或者

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

编辑

根据 dtb 的评论,我意识到我把我的类型转换放在了错误的地方。我的第一行不起作用(尽管我的第二行仍然可以)。发生的事情是您从 TotalSeconds 中获取双精度值并将其除以int ItemPos得到双精度值。但是然后你将它转换为一个 int,这是你将它设置为 0 的地方。正如 Henk Holterman 所说,你必须添加额外的括号,以便类型转换覆盖整个除法:

 int seconds = (int) ((elapsed.TotalSeconds / ItemPos) * (Count - ItemPos));
于 2013-07-15T16:26:26.967 回答