【问题标题】:simple calculation not working for some reason简单的计算由于某种原因不起作用
【发布时间】:2012-09-08 07:52:05
【问题描述】:

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

【问题讨论】:

    标签: c# .net percentage


    【解决方案1】:

    我在调试时检查了值,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 命名约定。它们应该是驼峰式 - totalFilesCount 和 filesCompleted。

    【讨论】:

    • 嗯,有趣,那是我还不知道的。
    【解决方案2】:

    怎么样

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

    这是在做什么

    1. 正在将 int FilesCompleted 转换为 double。例如,如果它是 295,那么这会将其转换为 295.0,这样除法就会发生在 double 中。

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

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

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

    【讨论】:

      【解决方案3】:

      FilesCompleted/TotalFilesCount 返回 0.01,int 格式为 0,试试FilesCompleted*100/TotalFilesCount!

      【讨论】:

        【解决方案4】:

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

        用途:

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

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

        【讨论】:

        • 我的错,已修复,() 有问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        相关资源
        最近更新 更多