C ++:四舍五入到数字的最接近倍数


168

好的-我几乎不好意思在这里发布此内容(如果有人投票关闭,我会删除),因为这似乎是一个基本问题。

这是在C ++中舍入到整数倍的正确方法吗?

我知道还有与此相关的其他问题,但是我特别想知道在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

3
您的逻辑有误-假设我想将4舍入到2的最接近倍数。roundDown =(4/2)* 2 = 4; roundUp = 4 + 2; 所以roundCalc =6。我假设在这种情况下,您想返回4。
Niki Yoshiuchi 2010年

这不适用于roundUp(30,30)。它给60的答案,它仍然应该给30的答案..
bsobaid

@bsobaid:在底部查看我的答案。它比这里的其他解决方案要简单一些,尽管这些解决方案也应适用
Niklas B.

3
您的测试用例明显缺少包含负数的示例,除法精确的情况,除法几乎精确的情况以及数字非常接近范围限制的情况int

1
Robben_Ford_Fan_boy,应删除包含您所寻求答案的编辑。如果答案与给定的答案不同,您可以发布自己的答案。就目前而言,该答案存在应在答案部分中解决的问题。
chux-恢复莫妮卡

Answers:


161

这适用于正数,不确定负数。它仅使用整数数学。

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;
}

+1在我看来,绝对是最好的,最易读的解决方案。
Robben_Ford_Fan_boy

1
添加if(number<0){ multiple = multiple*(-1); }在开始一轮负数在正确的方向
乔什-

4
@Josh:为什么要使用乘法?if(number<0) multiple = -multiple更容易。
md5 2013年

这不适用于roundUp(30,30)。它给出60作为答案,仍然应该给出30作为答案。
bsobaid 2014年

@bsobaid不可能。该if (remainder == 0)测试应该采取这种情况下照顾。它对我有用
Mark Ransom

112

无条件:

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倍http://quick-bench.com/sgPEZV9AUDqtx2uujRSa3-eTE80

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

测验


24
+1为2版本的幂。非常有用,因为它完全避免了乘法,除法或取模的成本。
Nikos C.

您确定这些算法没有先决条件吗?那负数呢?该行为似乎在C ++ 11之前的版本中未定义
cubuspl42

>负数呢?如上所述,这适用于负数,例如四舍五入为零。
KindDragon 2015年

我读到“向上舍入”的意思是向正无穷大舍入,而不是从零舍入。

8
注意,& ~(x - 1)这与& -x二进制补码算法相同。
Todd Lehman

39

当因子始终为正时,这将起作用:

int round_up(int num, int factor)
{
    return num + factor - 1 - (num - 1) % factor;
}

编辑:这将返回round_up(0,100)=100。请参阅下面Paul的评论,以获取返回的解决方案round_up(0,100)=0


1
看起来是处理“已经存在多个”情况的最短情况。
harningt

1
就昂贵的运营数量而言,这是最佳解决方案。它仅使用一个单一的分裂与增殖无
尼克拉斯B.

3
round_up(0,100)== 100,而不是公认的答案中的0
Gregory

7
不是num + factor - 1 - (num + factor - 1) % factor吗?
保罗

6
num - 1 - (num - 1) % factor + factor进行相同的计算,没有整数溢出的风险。

24

这是“我如何找出n位要占用多少字节?(A:(n位+ 7)/ 8)的问题的概括。

int RoundUp(int n, int roundTo)
{
    // fails on negative?  What does that mean?
    if (roundTo == 0) return 0;
    return ((n + roundTo - 1) / roundTo) * roundTo; // edit - fixed error
}

1
这不会四舍五入到一个数字的下一个倍数。
aaaa bbbb 2010年

7
我喜欢这种解决方案,因为如果roundTo将是2的幂,则可以消除/和*并最终得到便宜的操作(x = roundTo-1; return(n + x)&
〜x

@Trejkaz没有。它应该是(x = roundTo - 1; return (n+x)&~roundTo;)在我的答案
KindDragon

@KindDragon为我产生了错误的结果,但是如果我改正它说〜x而不是〜roundTo,则会得到预期的结果。无论如何在Java 8上。
Trejkaz

@KindDragon:“与”掩码必须为0xFFF...000,而不是,0xFFF7FFF否则,您需要以2的-幂为2 的补码取反(:负),或者以小于2的幂的方式进行位翻转(一个人的补码为反,~:代字号)不减)。所以(n+x) & ~x还是(n-roundTo+1) & -roundTo
彼得·科德斯

14
int roundUp(int numToRound, int multiple)
{
 if(multiple == 0)
 {
  return 0;
 }
 return ((numToRound - 1) / multiple + 1) * multiple;  
}

无需搞乱条件


11

对于任何寻求简短而甜蜜答案的人。这就是我用的。没有考虑负面因素。

n - (n % r)

那将返回先前的因素。

(n + r) - (n % r)

将返回下一个。希望这对某人有帮助。:)


9
float roundUp(float number, float fixedBase) {
    if (fixedBase != 0 && number != 0) {
        float sign = number > 0 ? 1 : -1;
        number *= sign;
        number /= fixedBase;
        int fixedPoint = (int) ceil(number);
        number = fixedPoint * fixedBase;
        number *= sign;
    }
    return number;
}

这适用于任何浮点数或基数(例如,您可以将-4舍入为最接近的6.75)。从本质上讲,它是转换为固定点,在那儿四舍五入,然后再转换回去。它通过从0舍入四舍五入来处理负数。它还通过将函数本质上变为roundDown来处理负整数。

特定于int的版本如下所示:

int roundUp(int number, int fixedBase) {
    if (fixedBase != 0 && number != 0) {
        int sign = number > 0 ? 1 : -1;
        int baseSign = fixedBase > 0 ? 1 : 0;
        number *= sign;
        int fixedPoint = (number + baseSign * (fixedBase - 1)) / fixedBase;
        number = fixedPoint * fixedBase;
        number *= sign;
    }
    return number;
}

附加的否定输入支持或多或少是plinth的答案。


我已经用double测试了float roundUp代码,它对我有用。真的解决了我的问题。
Ashif 2014年

1
怎么样double round(double value, double multiple) { double sign = value; multiple = std::copysign(multiple, 1.0); value = std::copysign(value, 1.0); return std::copysign(multiple * std::ceil(value / multiple), sign); }或将ceil换成舍入取整。
Troyseph

8

这是使用模板函数的现代c ++方法,该函数可用于float,double,long,int和short(但由于使用double值而不适用于long long和long double)。

#include <cmath>
#include <iostream>

template<typename T>
T roundMultiple( T value, T multiple )
{
    if (multiple == 0) return value;
    return static_cast<T>(std::round(static_cast<double>(value)/static_cast<double>(multiple))*static_cast<double>(multiple));
}

int main()
{
    std::cout << roundMultiple(39298.0, 100.0) << std::endl;
    std::cout << roundMultiple(20930.0f, 1000.0f) << std::endl;
    std::cout << roundMultiple(287399, 10) << std::endl;
}

但是,您可以轻松添加对模板专业化的支持,long longlong double使用模板专业化,如下所示:

template<>
long double roundMultiple<long double>( long double value, long double multiple)
{
    if (multiple == 0.0l) return value;
    return std::round(value/multiple)*multiple;
}

template<>
long long roundMultiple<long long>( long long value, long long multiple)
{
    if (multiple == 0.0l) return value;
    return static_cast<long long>(std::round(static_cast<long double>(value)/static_cast<long double>(multiple))*static_cast<long double>(multiple));
}

要创建要向上舍入,使用std::ceil并始终向下舍入的功能std::floor。我上面的示例是使用进行四舍五入std::round

创建“向上舍入”或更好地称为“圆形天花板”模板函数,如下所示:

template<typename T>
T roundCeilMultiple( T value, T multiple )
{
    if (multiple == 0) return value;
    return static_cast<T>(std::ceil(static_cast<double>(value)/static_cast<double>(multiple))*static_cast<double>(multiple));
}

创建“向下取整”或更好地称为“ round floor”模板功能,如下所示:

template<typename T>
T roundFloorMultiple( T value, T multiple )
{
    if (multiple == 0) return value;
    return static_cast<T>(std::floor(static_cast<double>(value)/static_cast<double>(multiple))*static_cast<double>(multiple));
}

1
加1,虽然有些人可能会发现它更合理的返回0时== 0多张
斯泰恩

3
当心,因为将int64_t转换为double可能是有损的,所以它看起来并不像泛型那样。
阿德里安·麦卡锡

@AdrianMcCarthy是的,您必须如上所述创建正确的模板专业化。如您所见,我为long long和实现了两个附加功能long double。显然,其他两个功能必须执行相同的操作。
Flovdis 2015年

我认为这是迄今为止最慢的,但不是必须的。您需要做的就是std :: enable_if_t并对整数和浮点数做两个分支。您还可以更好地利用numeric_limits并查看尾数是否足够大以实际适合该值。这将增加安全性。

5

首先,您的错误条件(多个== 0)应该具有返回值。什么?我不知道。也许您想抛出一个异常,这取决于您。但是,一无所获是危险的。

其次,您应该检查numToRound是否不是倍数。否则,当您添加multiple到时roundDown,您会得到错误的答案。

第三,你的演员选错了。您强制numToRound转换为整数,但它已经是整数。您需要在除法之前强制转换为双精度,在乘法后强制转换为int。

最后,您想要负数是什么?将“向上”舍入可以表示舍入为零(与正数相同的方向舍入)或远离零(“较大”的负数)。或者,也许您不在乎。

这是具有前三个修复程序的版本,但我不处理负面问题:

int roundUp(int numToRound, int multiple)
{
 if(multiple == 0)
 {
  return 0;
 }
 else if(numToRound % multiple == 0)
 {
  return numToRound
 }

 int roundDown = (int) (( (double) numToRound / multiple ) * multiple);
 int roundUp = roundDown + multiple; 
 int roundCalc = roundUp;
 return (roundCalc);
}

@Peter是吗?我以为int / int会返回一个int,这不是我们想要的。
Mike Caron

int / int确实确实返回一个int,但这正是您想要的。例如,numToRound = 7,多发性= 3.7 / 3 = 2
彼得Ruderman

4

四舍五入取整:

万一有人需要一个正数的解决方案,将其四舍五入到二的幂的最接近倍数(因为这就是我在这里得出的结果):

// number: the number to be rounded (ex: 5, 123, 98345, etc.)
// pow2:   the power to be rounded to (ex: to round to 16, use '4')
int roundPow2 (int number, int pow2) {
    pow2--;                     // because (2 exp x) == (1 << (x -1))
    pow2 = 0x01 << pow2;

    pow2--;                     // because for any
                                //
                                // (x = 2 exp x)
                                //
                                // subtracting one will
                                // yield a field of ones
                                // which we can use in a
                                // bitwise OR

    number--;                   // yield a similar field for
                                // bitwise OR
    number = number | pow2;
    number++;                   // restore value by adding one back

    return number;
}

如果输入的数字已经是倍数,则将保持不变。

这是GCC提供的-O2或x86_64输出-Os(9Sep2013 Build-godbolt GCC在线):

roundPow2(int, int):
    lea ecx, [rsi-1]
    mov eax, 1
    sub edi, 1
    sal eax, cl
    sub eax, 1
    or  eax, edi
    add eax, 1
    ret

每行C代码行均与其汇编中的行完美对应:http : //goo.gl/DZigfX

这些指令中的每条指令都非常快,因此功能也非常快。由于代码是如此的小巧而快速,因此inline在使用它时可能对函数很有用。


信用:


1
正是我想要的。谢谢!
2014年

1
int roundUpPow2(int num,int pow2){return num +(pow2-1-)&〜(pow2-1); }是约30%更快,更容易使用(你通过16不是4-围捕到16的下一个多
阿克塞尔Rietschin

3

我正在使用:

template <class _Ty>
inline _Ty n_Align_Up(_Ty n_x, _Ty n_alignment)
{
    assert(n_alignment > 0);
    //n_x += (n_x >= 0)? n_alignment - 1 : 1 - n_alignment; // causes to round away from zero (greatest absolute value)
    n_x += (n_x >= 0)? n_alignment - 1 : -1; // causes to round up (towards positive infinity)
    //n_x += (_Ty(-(n_x >= 0)) & n_alignment) - 1; // the same as above, avoids branch and integer multiplication
    //n_x += n_alignment - 1; // only works for positive numbers (fastest)
    return n_x - n_x % n_alignment; // rounds negative towards zero
}

对于二的幂:

template <class _Ty>
bool b_Is_POT(_Ty n_x)
{
    return !(n_x & (n_x - 1));
}

template <class _Ty>
inline _Ty n_Align_Up_POT(_Ty n_x, _Ty n_pot_alignment)
{
    assert(n_pot_alignment > 0);
    assert(b_Is_POT(n_pot_alignment)); // alignment must be power of two
    -- n_pot_alignment;
    return (n_x + n_pot_alignment) & ~n_pot_alignment; // rounds towards positive infinity (i.e. negative towards zero)
}

请注意,这两个负值均朝零舍入(这意味着所有值均朝正无穷取舍),它们都不依赖于有符号溢出(在C / C ++中未定义)。

这给出:

n_Align_Up(10, 100) = 100
n_Align_Up(110, 100) = 200
n_Align_Up(0, 100) = 0
n_Align_Up(-10, 100) = 0
n_Align_Up(-110, 100) = -100
n_Align_Up(-210, 100) = -200
n_Align_Up_POT(10, 128) = 128
n_Align_Up_POT(130, 128) = 256
n_Align_Up_POT(0, 128) = 0
n_Align_Up_POT(-10, 128) = 0
n_Align_Up_POT(-130, 128) = -128
n_Align_Up_POT(-260, 128) = -256

n_Align_Up_POT自从在Delphi的TList类中看到它以来,我就一直在使用它。它具有其局限性,例如对齐方式(多次)是2的幂,但这很少出现问题,因为我主要使用它来获取/检查SMID的正确对齐方式。它很棒,似乎没有多少人知道。
user1593842

2

将其强制转换为浮点数并使用ceil()可能更安全-除非您知道int除法将产生正确的结果。


1
请注意,在基于x86的计算机上,double仅可容纳54位有效数字。如果您有64位整数,它将最终失败。

IEEE754标准双精度不能,但是x64 cpus具有80位内部浮点,因此对单个数字的操作是可靠的
Martin Beckett

1
确实如此,但是您对C / C ++中的四舍五入几乎没有控制。它取决于控制字设置,实际上可能舍入到少于80位。另外,您还有SSE和其他SIMD指令集,它们没有这样的扩展中间件(向量化编译器可以轻松使用它们)。

2
int noOfMultiples = int((numToRound / multiple)+0.5);
return noOfMultiples*multiple

C ++将每个数字四舍五入,因此,如果您添加0.5(如果其1.5则为2),但1.49则为1.99,因此为1。

编辑-对不起,您没有看到您想要的内容,我建议使用ceil()方法而不是+0.5


2

一件事很好,因为我不太了解你想做什么,所以线条

int roundUp = roundDown + multiple;
int roundCalc = roundUp;
return (roundCalc); 

绝对可以缩短为

int roundUp = roundDown + multiple;
return roundUp;

2

可能这可以帮助:

int RoundUpToNearestMultOfNumber(int val, int num)
{
  assert(0 != num);
  return (floor((val + num) / num) * num);
}

为什么要使用最小和整数除法?地板上没有东西。如果为两倍,则至少可以继承负值的处理。

2

总是四舍五入

int alwaysRoundUp(int n, int multiple)
{
    if (n % multiple != 0) {
        n = ((n + multiple) / multiple) * multiple;

        // Another way
        //n = n - n % multiple + multiple;
    }

    return n;
}

alwaysRoundUp(1,10)-> 10

alwaysRoundUp(5,10)-> 10

alwaysRoundUp(10,10)-> 10


总是四舍五入

int alwaysRoundDown(int n, int multiple)
{
    n = (n / multiple) * multiple;

    return n;
}

alwaysRoundDown(1,10)-> 0

alwaysRoundDown(5,10)-> 0

alwaysRoundDown(10,10)-> 10


以正常方式

int normalRound(int n, int multiple)
{
    n = ((n + multiple/2)/multiple) * multiple;

    return n;
}

normalRound(1,10)-> 0

normalRound(5,10)-> 10

normalRound(10,10)-> 10


2

四舍五入到最接近的2的整数倍

unsigned int round(unsigned int value, unsigned int multiple){
    return ((value-1u) & ~(multiple-1u)) + multiple;
}

这对于沿高速缓存行分配时很有用,在这种情况下,所需的舍入增量为2的幂,但是结果值仅需为其整数倍。在gcc此函数的主体上,生成8条汇编指令,其中没有除法或分支。

round(  0,  16) ->   0
round(  1,  16) ->  16
round( 16,  16) ->  16
round(257, 128) -> 384 (128 * 3)
round(333,   2) -> 334

1

我发现一种算法与上面发布的算法有些相似:

int [(| x | + n-1)/ n] * [(nx)/ | x |],其中x是用户输入的值,n是正在使用的倍数。

它适用于所有值x,其中x是一个整数(正数或负数,包括零)。我是专门为C ++程序编写的,但是基本上可以用任何语言实现。


1

对于负数numToRound:

这样做确实应该很容易,但是标准的%模运算符不会像人们期望的那样处理负数。例如-14%12 = -2而不是10。首先要做的是获取从不返回负数的模运算符。然后RoundUp真的很简单。

public static int mod(int x, int n) 
{
    return ((x % n) + n) % n;
}

public static int roundUp(int numToRound, int multiple) 
{
    return numRound + mod(-numToRound, multiple);
}

1

这就是我要做的:

#include <cmath>

int roundUp(int numToRound, int multiple)
{
    // if our number is zero, return immediately
   if (numToRound == 0)
        return multiple;

    // if multiplier is zero, return immediately
    if (multiple == 0)
        return numToRound;

    // how many times are number greater than multiple
    float rounds = static_cast<float>(numToRound) / static_cast<float>(multiple);

    // determine, whether if number is multiplier of multiple
    int floorRounds = static_cast<int>(floor(rounds));

    if (rounds - floorRounds > 0)
        // multiple is not multiplier of number -> advance to the next multiplier
        return (floorRounds+1) * multiple;
    else
        // multiple is multiplier of number -> return actual multiplier
        return (floorRounds) * multiple;
}

该代码可能不是最佳的,但是我更喜欢干净的代码而不是干性能。


将强制转换为intfloat很容易失去精度,并导致错误的答案。
chux-恢复莫妮卡

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

虽然:

  • 不适用于负数
  • 如果numRound +多次溢出将不起作用

建议改用无符号整数,它定义了溢出行为。

您将获得一个例外,即为== 0的倍数,但是在那种情况下,这并不是一个明确定义的问题。


1

C:

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

并为您的〜/ .bashrc:

roundup()
{
  echo $(( ${2} ? ((${1}+${2}-1)/${2})*${2} : ${1} ))
}

1

如果x已经是倍数,我使用模数组合来抵消余数的加法:

int round_up(int x, int div)
{
    return x + (div - x % div) % div;
}

我们发现余数的倒数,然后求除数的模数,如果它是除数本身,则再次使它无效,然后相加x

round_up(19, 3) = 21

1

这是我根据OP的建议以及其他所有人提供的示例得出的解决方案。由于大多数人都在寻找可处理负数的方法,因此该解决方案可以做到这一点,而无需使用任何特殊功能,例如abs等。

通过舍弃模数而改用除法,尽管它是向下取整的,但负数是自然的结果。在计算出四舍五入后的版本之后,它会执行所需的数学运算以朝负方向或朝正方向四舍五入。

还要注意,没有特殊的函数可用于计算任何东西,因此那里的速度提高很小。

int RoundUp(int n, int multiple)
{
    // prevent divide by 0 by returning n
    if (multiple == 0) return n;

    // calculate the rounded down version
    int roundedDown = n / multiple * multiple;

    // if the rounded version and original are the same, then return the original
    if (roundedDown == n) return n;

    // handle negative number and round up according to the sign
    // NOTE: if n is < 0 then subtract the multiple, otherwise add it
    return (n < 0) ? roundedDown - multiple : roundedDown + multiple;
}

以失败RoundUp(INT_MIN, -1)n / multipleint溢出。
chux-恢复莫妮卡

1

我认为这应该对您有帮助。我已经用C语言编写了以下程序。

# include <stdio.h>
int main()
{
  int i, j;
  printf("\nEnter Two Integers i and j...");
  scanf("%d %d", &i, &j);
  int Round_Off=i+j-i%j;
  printf("The Rounded Off Integer Is...%d\n", Round_Off);
  return 0;
}

0
/// Rounding up 'n' to the nearest multiple of number 'b'.
/// - Not tested for negative numbers.
/// \see http://stackoverflow.com/questions/3407012/
#define roundUp(n,b) ( (b)==0 ? (n) : ( ((n)+(b)-1) - (((n)-1)%(b)) ) )

/// \c test->roundUp().
void test_roundUp() {   
    // yes_roundUp(n,b) ( (b)==0 ? (n) : ( (n)%(b)==0 ? n : (n)+(b)-(n)%(b) ) )
    // yes_roundUp(n,b) ( (b)==0 ? (n) : ( ((n + b - 1) / b) * b ) )

    // no_roundUp(n,b) ( (n)%(b)==0 ? n : (b)*( (n)/(b) )+(b) )
    // no_roundUp(n,b) ( (n)+(b) - (n)%(b) )

if (true) // couldn't make it work without (?:)
{{  // test::roundUp()
    unsigned m;
                { m = roundUp(17,8); } ++m;
    assertTrue( 24 == roundUp(17,8) );
                { m = roundUp(24,8); }
    assertTrue( 24 == roundUp(24,8) );

    assertTrue( 24 == roundUp(24,4) );
    assertTrue( 24 == roundUp(23,4) );
                { m = roundUp(23,4); }
    assertTrue( 24 == roundUp(21,4) );

    assertTrue( 20 == roundUp(20,4) );
    assertTrue( 20 == roundUp(19,4) );
    assertTrue( 20 == roundUp(18,4) );
    assertTrue( 20 == roundUp(17,4) );

    assertTrue( 17 == roundUp(17,0) );
    assertTrue( 20 == roundUp(20,0) );
}}
}

0

这是您正在寻找正整数的结果:

#include <iostream>
using namespace std;

int roundUp(int numToRound, int multiple);

int main() {
    cout << "answer is: " << roundUp(7, 100) << endl;
    cout << "answer is: " << roundUp(117, 100) << endl;
    cout << "answer is: " << roundUp(477, 100) << endl;
    cout << "answer is: " << roundUp(1077, 100) << endl;
    cout << "answer is: " << roundUp(52,20) << endl;
    cout << "answer is: " << roundUp(74,30) << endl;
    return 0;
}

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

这是输出:

answer is: 100
answer is: 200
answer is: 500
answer is: 1100
answer is: 60
answer is: 90

0

我认为这可行:

int roundUp(int numToRound, int multiple) {
    return multiple? !(numToRound%multiple)? numToRound : ((numToRound/multiple)+1)*multiple: numToRound;
}

-1

这对我有效,但没有尝试处理负面问题

public static int roundUp(int numToRound, int multiple) {
    if (multiple == 0) {
        return 0;
    } else if (numToRound % multiple == 0) {
    return numToRound;
    }

    int mod = numToRound % multiple;
    int diff = multiple - mod;
    return numToRound + diff;
}

-2

这是展示优雅概念的超简单解决方案。它基本上是用于网格捕捉的。

(伪代码)

nearestPos = Math.Ceil( numberToRound / multiple ) * multiple;

在提交之前,您是否检查过您的想法?它没有给出正确的答案
yaodav

那甚至不是有效的代码。
user13783520
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.