内置.Net算法,将值舍入到最接近的10个区间

Gra*_*ton 63 c# math rounding

如何在C#中将任意值舍入到10个区间?例如,如果我有11,我希望它返回10,如果我有136,那么我希望它返回140.

我可以轻松地手工完成

return ((int)(number / 10)) * 10;
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种内置算法来完成这项工作,比如Math.Round().我不想手工做的原因是我不想在我的项目中编写相同或类似的代码,即使是像上面那样简单的东西.

Chr*_*ruk 95

类库中没有内置函数可以执行此操作.最接近的是System.Math.Round(),它仅用于将Decimal和Double类型的数字舍入到最接近的整数值.但是,如果使用的是.NET 3.5,则可以使用扩展方法将语句包装起来,这样可以更加干净地使用该函数.

public static class ExtensionMethods
{
    public static int RoundOff (this int i)
    {
        return ((int)Math.Round(i / 10.0)) * 10;
    }
}

int roundedNumber = 236.RoundOff(); // returns 240
int roundedNumber2 = 11.RoundOff(); // returns 10
Run Code Online (Sandbox Code Playgroud)

如果你是针对旧版本的.NET框架进行编程,只需从RoundOff函数中删除"this",然后像这样调用函数:

int roundedNumber = ExtensionMethods.RoundOff(236); // returns 240
int roundedNumber2 = ExtensionMethods.RoundOff(11); // returns 10
Run Code Online (Sandbox Code Playgroud)

  • 我说我修好了,不是吗? (3认同)
  • Dan Diplo:下一句话,OP解释他想要什么,描述四舍五入.阅读整个问题,而不仅仅是它的第一句话. (3认同)
  • 这个问题要求"四舍五入",但这个答案完成了.如果输入11,则应该返回20,而不是10.这就是你需要`Math.Ceiling()`的原因. (2认同)

Arm*_*est 20

使用Math.Ceiling始终向上舍入.

int number = 236;
number = (int)(Math.Ceiling(number / 10.0d) * 10);
Run Code Online (Sandbox Code Playgroud)

模数(%)获得余数,因此得到:

// number = 236 + 10 - 6
Run Code Online (Sandbox Code Playgroud)

把它放到扩展方法中

public static int roundupbyten(this int i){
    // return i + (10 - i % 10); <-- logic error. Oops!
    return (int)(Math.Ceiling(i / 10.0d)*10); // fixed
}

// call like so:
int number = 236.roundupbyten();
Run Code Online (Sandbox Code Playgroud)

以上编辑:我应该用我的第一直觉去使用Math.Ceiling

在计算UPC校验位时写了这篇博文.

  • 用 240 试试。那你会得到什么?或者就此而言,11。 (2认同)

Jro*_*nny 8

这可能有点太晚了,但我想有一天这可能会有很好的帮助......

我试过这个:

public int RoundOff(int number, int interval){
    int remainder = number % interval;
    number += (remainder < interval / 2) ? -remainder : (interval - remainder);
    return number;
}
Run Code Online (Sandbox Code Playgroud)

使用:

int number = 11;
int roundednumber = RoundOff(number, 10);
Run Code Online (Sandbox Code Playgroud)

这样,您可以选择是否将间隔的一半向上舍入或向下舍入.=)


Ray*_*eau 5

将浮点数舍入为整数类似于 (int)(x+0.5),而不是简单地强制转换 x - 如果您想要 10 的倍数,您可以轻松地进行调整。

如果您只想进行整数数学运算并将其四舍五入为 10,请尝试 (x+10/2)/10*10。

编辑:我注意到这个回复不符合原作者的要求,也是一种我不想做的有偏见的四舍五入形式。然而,另一个被接受的回应已经说明了 Math.round(),一个更好的解决方案。