简单的计算由于某种原因不起作用

时间:2012-09-08 07:52:06

标签: c# .net percentage

好吧,我正在尝试计算两个值的百分比。这应该是非常简单的,但由于一些奇怪的原因,它不起作用。我太累了/笨到想不出来。 这是我的代码,它一直返回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;
        }

4 个答案:

答案 0 :(得分:11)

  

我在调试时检查了值,并且FilesCompleted为295,TotalFilesCount为25002,returnvalue var只为0,它应该是1。

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

(FilesCompleted / TotalFilesCount)

那是295 / 25002. 整数算术的结果是0 ...然后当你将它乘以100时,你仍然得到0。最简单的修复只是先进行乘法运算:

int returnvalue = (FilesCompleted * 100) / TotalFilesCount;

请注意,如果FilesCompleted大于int.MaxValue / 100,则会溢出。您可以通过在浮点运算中执行所有操作来解决此问题:

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

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

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

如果您不希望文件数量过多,那么这些都不是必需的。 (你最多可以获得4200万个文件......)

作为旁注,您的参数名称违反了.NET命名约定。它们应该是camelCased - totalFilesCountfilesCompleted

答案 1 :(得分:2)

怎么样

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

这是做什么

  1. int FilesCompleted转换为double。例如,如果它是295,那么这将它转换为295.0,以便除法发生在双倍。

    没有必要将TotalFilesCount转换为double也可以将double乘以整数(或整数乘以double)返回double。

  2. 所以返回的double结果是0.011799056075513958,乘以100

  3. 所以重新结果是1.1799056075513958,最后转换为int,返回1

答案 2 :(得分:1)

确实,简单的错误,当使用int进行转移时,答案将是一个int。你的答案将介于0和1之间,因此向下舍入为0(int)。

使用:

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

要使计算对分数使用双精度,然后将其乘以100并将其转换为int。

答案 3 :(得分:1)

FilesCompleted/TotalFilesCount返回0.01,其中int格式为0,请尝试FilesCompleted*100/TotalFilesCount