0

好吧,我正在尝试计算两个值的百分比。这应该很简单,但由于某些奇怪的原因它不起作用。我太累/太笨了,无法弄清楚。这是我的代码,它一直返回 0,我在调试时检查了值,FilesCompleted 为 295,TotalFilesCount 为 25002,返回值 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

4 回答 4

12

我在调试时检查了这些值,FilesCompleted 为 295,TotalFilesCount 为 25002,返回值 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 命名约定。它们应该是驼峰式 -totalFilesCountfilesCompleted.

于 2012-09-08T07:54:10.847 回答
2

怎么样

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

这是在做什么

  1. intFilesCompleted 转换为double. 例如,如果它是 295,那么这会将其转换为 295.0,这样除法就会以双倍进行。

    也无需转换TotalFilesCount为 double,因为 double 除以整数(或整数除以 double)返回 double。

  2. 所以返回的双精度结果是 0.011799056075513958 乘以 100

  3. 所以返回的结果是 1.1799056075513958 最终转换为返回 1 的 int

于 2012-09-08T07:56:09.630 回答
1

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

采用:

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

为了使您的计算使用双精度数作为小数,然后将其乘以 100 并将其转换为 int。

于 2012-09-08T07:55:43.040 回答
1

返回 0.01 ,FilesCompleted/TotalFilesCountint 格式为 0,试试看FilesCompleted*100/TotalFilesCount

于 2012-09-08T07:57:06.037 回答