2012-09-08 37 views
0

好吧,我试图计算两个值的百分比。这应该很简单,但由于一些奇怪的原因,它不起作用。我太累了/笨拙地弄清楚了。 这里是我的代码,它一直返回0,我在调试时检查了值,而FilesCompleted是295,TotalFilesCount是25002,returnvalue var只是0,它应该是1。简单的计算不起作用的某种原因

private int CalculatePercentComplete(int FilesCompleted, int TotalFilesCount) 
     { 
      int returnvalue = (FilesCompleted/TotalFilesCount) * 100; 

      if (returnvalue > 100 || returnvalue < 1) return 1; 
      else return returnvalue; 
     } 

回答

12

我检查的值,同时调试和与FilesCompleted为295和TotalFilesCount为25002的返回值var为只是0,它应该是1已经。

不,因为所有的算术都是用整数完成的。所以首先这个表达式求值:

(FilesCompleted/TotalFilesCount) 

这是295/25002.这整数算术0的结果...当你再乘以100,在你已经仍然得到0。最简单的解决方法是只先做乘法:

int returnvalue = (FilesCompleted * 100)/TotalFilesCount; 

注意,如果FilesCompletedint.MaxValue/100大于溢出。你可以在浮点运算解决,通过任一做的一切:

int returnvalue = (int)((FilesCompleted * 100.0)/TotalFilesCount); 

...或使用long整数运算:

int returnvalue = (int)((FilesCompleted * 100L)/TotalFilesCount); 

这些都不是必要的,如果你不希望有当然,这是疯狂的文件数量。 (你可以多达4200万个文件...)

作为一个方面说明,你的参数名称违反了.NET命名约定。他们应该是骆驼 - totalFilesCountfilesCompleted

+1

恩,有趣的是,这是我还不知道的东西。 – user1071461

2

事实上,简单的错误,当用int进行转换时,答案将是一个int。您的答案将介于0和1之间,所以向下舍入为0(int)。

用途:

int returnvalue = (int)((FilesCompleted/(double)TotalFilesCount) * 100); 

为了使您的计算使用双的分数,然后乘上100并强制转换成int类型。

+0

我的不好,修正了它,() – SynerCoder

3

如何

int returnvalue = (int)(((double)FilesCompleted/TotalFilesCount) * 100); 

这是什么东西做的

  1. 转换int FilesCompleted到double。例如,如果它的295,那么这将把它转换成295.0,所以分割发生在两倍。

    没有必要将TotalFilesCount转换为double,因为div整数(或double整数)返回double。

  2. 所以返回的双倍结果是0。011799056075513958其由100

  3. multipled所以retunred结果是1.1799056075513958其最终转化为int返回1

2

FilesCompleted/TotalFilesCount回报0.01在INT格式是0,尝试FilesCompleted*100/TotalFilesCount

相关问题