Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 估计剩下的时间,我错过了什么?_C# - Fatal编程技术网

C# 估计剩下的时间,我错过了什么?

C# 估计剩下的时间,我错过了什么?,c#,C#,我认为我的逻辑有缺陷 在一个循环中,我有: int seconds = (int) (elapsed.TotalSeconds / ItemPos) * (Count - ItemPos); 此循环大约每秒更新一次 我的问题是秒总是以零(0)值结束 这是因为在第一次循环后,ItemPos值始终高于经过的时间。TotalSeconds 例如: 如果过了3秒 ItemCount = 20 , so 3/20 = 0.15 - rounds to zero.... 0 * anything = 0.

我认为我的逻辑有缺陷

在一个循环中,我有:

int seconds = (int) (elapsed.TotalSeconds / ItemPos) * (Count - ItemPos);
此循环大约每秒更新一次

我的问题是秒总是以零(0)值结束

这是因为在第一次循环后,
ItemPos
值始终高于
经过的时间。TotalSeconds

例如:

如果过了3秒

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

我做错了什么?

整数除法总是返回一个int,当结果为0.0时,它会截断为0

让一些东西真正有价值,你就没事了。或者,先乘后除:

int秒=(int)((浮点)已用秒数/ItemPos)*(计数-ItemPos)

(见下文)

编辑

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

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

你的表达被解释为

( (int)(elapsed.TotalSeconds / ItemPos) ) * (Count - ItemPos);
您必须延迟类型转换,所需的只是一对额外的
()


你的第一个除法是四舍五入到0。首先将操作数强制转换为(浮点)。@EricLaw:TimeSpan.TotalSeconds是一个
双精度
@EricLaw-非常好。。。我将添加解决方案…OP的代码中没有整数除法(假设
已用时间
是一个时间跨度)。问题是
(int)
强制转换的位置。如果您有一个非负
x
和一个正
y
,其中
x
,那么
(int)(x/y)
将始终返回0,无论
x
是双精度浮点还是整数。OP代码中的问题不是除法。
( (int)(elapsed.TotalSeconds / ItemPos) ) * (Count - ItemPos);
 //int seconds = (int)   (elapsed.TotalSeconds / ItemPos) * (Count - ItemPos)  ;
   int seconds = (int) ( (elapsed.TotalSeconds / ItemPos) * (Count - ItemPos) );