【问题标题】:Finding the percent of a number查找数字的百分比
【发布时间】:2013-09-13 16:26:47
【问题描述】:

我想创建一个函数,它以 int 形式返回数字的百分比(在本例中为 10%,因此它将返回传入的 int 的 10%),例如,如果您传递了 76,它将返回 8。 本质上它就像下面的函数,但我认为必须有更好的方法来做到这一点。

int percent(int y){
    int x;
    if(y >= 95)
        return 10;
    else if(y >= 85)
        return 9;
    else if(y >= 75)
        return 8;
    ...
}

【问题讨论】:

  • return (y+5)/10;?
  • 您可以使用浮点计算吗?我想知道这是不是作业。
  • 我看到变量y被传入了。变量x是做什么用的?
  • 你需要 10% 还是 n% 的函数?

标签: c++ c performance algorithm


【解决方案1】:
int percent(int y){
   return (y + 5) / 10;
}

你在那里有整数除法,所以它可以用于四舍五入!

【讨论】:

  • 调用这个方法percent 有点牵强。它更像是一个四舍五入的除以十。
  • 对不起,我不是故意要读这么多……这只是一个例子,所以人们可以理解我的要求。 “返回 (y+5)/10;”正是我想要的,谢谢。
【解决方案2】:

你可以用这个:

int percent(int y){
    return (y + 5) / 10;
}

但是我会给这个函数一个不同的名字,因为我认为这不是百分比的正常含义。

【讨论】:

    【解决方案3】:

    这适用于任何百分比,而不仅仅是 10。

        int CountPercentage(int input, int percentage)
        {
            long long x = static_cast<long long>(input) * static_cast<long long>(percentage);
            long long ret = x / 100;
    
            if (x - ret * 100 >= 50)
            ++ret;
            return static_cast<int>(ret);
        }
    

    如果你可以使用 WinAPI,你也可以这样解决:

    int CountPercentage(int input, int percentage)
    {
        return MulDiv(input, percentage, 100);
    }
    

    【讨论】:

    • 我认为MulDiv 会补偿溢出,但您的CountPercentage 不会。
    • @MooingDuck 感谢您指出我的错误。 MulDiv 期间的临时结果是 64 位宽,所以它的计算总是正确的......
    • 呃,现在我看了你的代码,你的四舍五入是错误的。你...可能想调查一下。 (提示:ret*100总是&gt;50,除非ret==0。)
    • 也刚刚注意到long long x = input * percentage; 仍然溢出,因为它会溢出,然后转换为64位
    • @MooingDuck 我不得不承认,那没有考虑到这一点,做了修复,但现在代码看起来不太好。
    【解决方案4】:

    如果输入总是不是负数,你可以使用这个:

    int percent(int y){
       return (y + 5) / 10;
    }
    

    否则你需要这个:

    int percent(int y){
        return (y >= 0 ? (y + 5) : (y - 5)) / 10;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2017-05-29
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多