如何在C#中将任意值舍入到10个区间?例如,如果我有11,我希望它返回10,如果我有136,那么我希望它返回140.
我可以轻松地手工完成
return ((int)(number / 10)) * 10;
但我正在寻找一种内置算法来完成这项工作,比如Math.Round().我不想手工做的原因是我不想在我的项目中编写相同或类似的代码,即使是像上面那样简单的东西.
类库中没有内置函数可以执行此操作.最接近的是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
如果你是针对旧版本的.NET框架进行编程,只需从RoundOff函数中删除"this",然后像这样调用函数:
int roundedNumber = ExtensionMethods.RoundOff(236); // returns 240 int roundedNumber2 = ExtensionMethods.RoundOff(11); // returns 10
使用Math.Ceiling始终向上舍入.
int number = 236; number = (int)(Math.Ceiling(number / 10.0d) * 10);
模数(%)获得余数,因此得到:
// number = 236 + 10 - 6
把它放到扩展方法中
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();
以上编辑:我应该用我的第一直觉去使用Math.Ceiling
我在计算UPC校验位时写了这篇博文.
这可能有点太晚了,但我想有一天这可能会有很好的帮助......
我试过这个:
public int RoundOff(int number, int interval){ int remainder = number % interval; number += (remainder < interval / 2) ? -remainder : (interval - remainder); return number; }
使用:
int number = 11; int roundednumber = RoundOff(number, 10);
这样,您可以选择是否将间隔的一半向上舍入或向下舍入.=)