为什么这会返回 0?

Why is this returning 0?

也许我熬夜太多了,但我有以下代码:

MessageBox.Show(
  Convert.ToInt32(
    Math.Round(
      (double)( ( i+1 )/r.Count )*100 ,
      0
    )
  ).ToString()
);

总是 returns 0,即使 i=120000r.Count=150000 也是如此。这是一个简单的进度计算,其中 i 是循环中的当前迭代,r 是集合( List() )。

我已经把代码分开了,连下面的还是returns0:

Convert.ToInt32( 
           Math.Round( 
                      (double)(( 120000+1 )/167428 )*100
                      , 0 )
                )

不确定这里发生了什么,所以对我做错了什么有任何见解(可能是前额拍击)。应该是(使用上面的数字),返回 71.

@Habib 的标记为重复:

that duplicate you claim -- is actually different, even the solutions don't apply here as this was a casting issue to double, and not adding 'm' with additional decimal points to each variable in play.

(( 120000+1 )/167428 ) 将计算为 0

167428 不进入 120001。您可以尝试这样:

Convert.ToInt32( 
       Math.Round( 
                  (((double)120000f+(double)1f )/(double)167428f )*(double)100f
                  , 0 )
            )

在 进行整数除法后,您正在加倍

因为 ( 120000+1 )/167428 仍在使用整数数学来完成。它不是 ~0.716,而是 0.

如果您以后想避免这种情况,请确保您也将分子和分母转换为双精度数。

( (double)( i+1 )/(double)r.Count )*100

以下将评估为 ( 120000+1 )/167428 ) 到 0,因为它们是 int 并且不保持小数精度,试试这个

Convert.ToInt32(Math.Round(((double)(120000+1 ) / (double)167428 ) * 100))

这与隐式转换有关

https://msdn.microsoft.com/en-us/library/ms173105.aspx

操作:(120000+1)/167428 returns 一个整数作为结果,0。 您在执行此整数除法后正在转换 double。

像其他用户建议尝试转换值:

  (double)(( (float)120000f+1 )/(float)167428f )*100

如果 r.Count > i+1,那么 (i+1) / r.Count 会给你一个零。两者都是整数,因此小数点后的任何内容都会被截断。

您的意思可能是将 i+1r.Count 转换为两倍,然后您会得到您期望的答案。

例如:

(i+1) / (double)r.Count

试试这个:

您必须在除法之前将两个值之一转换为 double。

Convert.ToInt32( 
           Math.Round( 
                      (((double)( 120000+1 ))/167428 )*100
                      , 0 )
                )