也许我晚上花了太多夜,但我有以下代码:
MessageBox.Show(
Convert.ToInt32(
Math.Round(
(double)( ( i+1 )/r.Count )*100 ,
0
)
).ToString()
);
即使i=120000
和r.Count=150000
,也始终返回0。这是一个简单的进度计算,其中i
是循环中的当前迭代,r
是集合(List())。
我已经分开了代码,甚至以下代码仍然返回0:
Convert.ToInt32(
Math.Round(
(double)(( 120000+1 )/167428 )*100
, 0 )
)
不知道这里发生了什么,所以对我做错了什么(可能是前额扒手)的任何见解。它应该是(使用上面的数字),返回71。
@Habib的旗帜为重复:
复制你声称的实际上是不同的,甚至是 解决方案不适用于此,因为这是一个加倍的问题,并且 不向每个变量添加带有附加小数点的'm' 播放。
答案 0 :(得分:9)
因为( 120000+1 )/167428
仍然使用整数数学来完成。而不是~0.716,它是0。
如果你想在将来避免这种情况,请确保你也将分子和分母投射到双精灵。
( (double)( i+1 )/(double)r.Count )*100
答案 1 :(得分:4)
在进行整数除法之后,您正在进行加倍。
答案 2 :(得分:3)
以下将评估为(120000 + 1)/ 167428)为0,因为它们是int并且不保持小数精度,试试这个
Convert.ToInt32(Math.Round(((double)(120000+1 ) / (double)167428 ) * 100))
答案 3 :(得分:2)
这与隐式转化
有关https://msdn.microsoft.com/en-us/library/ms173105.aspx
操作:(120000+1)/167428
返回一个整数作为结果,0。
在进行整数除法后,你正在加倍。
像其他用户建议尝试转换值:
(double)(( (float)120000f+1 )/(float)167428f )*100
答案 4 :(得分:0)
((120000 + 1)/ 167428)将评估为0
167428没有进入120001.你可以尝试的是:
info()
答案 5 :(得分:0)
如果r.Count
> i+1
,然后(i+1) / r.Count
会给你零。两者都是整数,因此小数点后的任何内容都会被截断。
你可能意味着要将i+1
或r.Count
投两方,然后你会得到你期望的答案。
例如:
(i+1) / (double)r.Count
答案 6 :(得分:0)
试试这个:
在分割之前,您必须将两个值之一转换为双倍。
Convert.ToInt32(
Math.Round(
(((double)( 120000+1 ))/167428 )*100
, 0 )
)