为什么这会返回0?

时间:2015-07-09 17:06:49

标签: c# rounding

也许我晚上花了太多夜,但我有以下代码:

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

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

我已经分开了代码,甚至以下代码仍然返回0:

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

不知道这里发生了什么,所以对我做错了什么(可能是前额扒手)的任何见解。它应该是(使用上面的数字),返回71。

@Habib的旗帜为重复:

  复制你声称的实际上是不同的,甚至是   解决方案不适用于此,因为这是一个加倍的问题,并且   不向每个变量添加带有附加小数点的'm'   播放。

7 个答案:

答案 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+1r.Count投两方,然后你会得到你期望的答案。

例如:

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

答案 6 :(得分:0)

试试这个:

在分割之前,您必须将两个值之一转换为双倍。

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