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