"将数值四舍五入至最接近某个数字的倍数"

20 浏览
0 Comments

"将数值四舍五入至最接近某个数字的倍数"

好的-我几乎感到尴尬在这里发布这个问题(如果有人投票关闭,我将删除),因为它似乎是一个基本问题。

这是将一个数舍入为另一个数的倍数的正确方法吗?

我知道有其他相关的问题,但我特别想知道在C ++中做到这一点的最佳方法是什么:

int roundUp(int numToRound, int multiple)
{
 if(multiple == 0)
 {
  return numToRound;
 }
 int roundDown = ( (int) (numToRound) / multiple) * multiple;
 int roundUp = roundDown + multiple; 
 int roundCalc = roundUp;
 return (roundCalc);
}

更新:

抱歉,我可能没有表达清意图。 这里有一些例子:

roundUp(7, 100)
//return 100
roundUp(117, 100)
//return 200
roundUp(477, 100)
//return 500
roundUp(1077, 100)
//return 1100
roundUp(52, 20)
//return 60
roundUp(74, 30)
//return 90

admin 更改状态以发布 2023年5月25日
0
0 Comments

没有条件:

int roundUp(int numToRound, int multiple) 
{
    assert(multiple);
    return ((numToRound + multiple - 1) / multiple) * multiple;
}

对于负数,类似于远离零的四舍五入


适用于负数的版本:

int roundUp(int numToRound, int multiple) 
{
    assert(multiple);
    int isPositive = (int)(numToRound >= 0);
    return ((numToRound + isPositive * (multiple - 1)) / multiple) * multiple;
}

测试


如果multiple是2的幂(速度可以提高约3.7倍)

int roundUp(int numToRound, int multiple) 
{
    assert(multiple && ((multiple & (multiple - 1)) == 0));
    return (numToRound + multiple - 1) & -multiple;
}

测试

0
0 Comments

这适用于正数,不确定负数是否适用。它只使用整数运算。

int roundUp(int numToRound, int multiple)
{
    if (multiple == 0)
        return numToRound;
    int remainder = numToRound % multiple;
    if (remainder == 0)
        return numToRound;
    return numToRound + multiple - remainder;
}

编辑:如果“向上”指的是结果始终大于或等于输入,则以下是适用于负数的版本。

int roundUp(int numToRound, int multiple)
{
    if (multiple == 0)
        return numToRound;
    int remainder = abs(numToRound) % multiple;
    if (remainder == 0)
        return numToRound;
    if (numToRound < 0)
        return -(abs(numToRound) - remainder);
    else
        return numToRound + multiple - remainder;
}

0