以下将给定数字四舍五入到下一个10的倍数的算法有效吗



我在How do I find the next multiple of 10 of any integer?,我想出的这个似乎与帖子中的任何答案都不匹配,所以我想知道我下面的想法是否有问题:

if(n % 10 != 0)
{
return ((n / 10) + 1) * 10;
}
return n;

条件检查只是在n是十进制数(例如,10、980等(的情况下进行的,在这种情况下,我们返回原始数。

n / 10给出了10的截断倍数(n是一个整数,n/10在我使用的语言(C++(中执行整数除法(,然后我们简单地将1加上,然后乘以10。或者我们可以做n / 10 * 10 + 10

根据除法对负整数的作用方式,您的解决方案可能对负整数无效。但让我们假设非负整数。。。

你的想法就是这个答案的变体:

int inline roundup10(int n) {
return ((n - 1) / 10 + 1) * 10;
}

唯一的区别是,您不会首先从n中减去1,因此您必须有一个if来使用模运算符隔离一个情况。

对于C型除法,引用的解决方案不适用于n=0,因此另一个答案给出了更好的变体:

A = (A + 9) / 10 * 10

您的解决方案也与此解决方案类似:

res = (n / 10)*10 + ((n % 10) ? 10:0);

此处的三进制与您的if条件相匹配。唯一的区别是,这里的除法和乘法都发生在两种情况下,条件只适用于10的加法或不适用于10,而加法是1(在与10相乘之前(。

当然,你可以在问答中找到许多不同的解决方案;一个页面,玩弄着操作的顺序,但很难想象有什么从根本上不同,而且仍然简短而甜蜜。

如果n不是负,您的代码确实有效,但最好这样做:

n += 9 - (n+9)%10

它的业务较少,没有分支机构。

你也可以像一样使用截断除法

n = (n+9)/10 * 10

请注意,如果你要四舍五入到二进制幂的倍数,那么你可以用移位和掩码代替%/来做同样的事情,正确地处理负数。

如果n大于MAX_INTEGER-9,则这些方法是不安全的。如果这是可能的,那么你可以在没有分支的情况下这样做:

n += 9 - ((n%10)+9)%10

或使用分支:

n += 9 - (n > 10 ? n-1 : n+9) % 10

最新更新