内置.Netalgorithm将值舍入到最近的10个区间
如何在C#中的任何值10间隔? 例如,如果我有11,我希望它返回10,如果我有136,那么我想它返回140。
我可以很容易地手工完成
return ((int)(number / 10)) * 10;
但是我正在寻找一个内置的algorithm来做这个工作,像Math.Round()。 我不想亲手做的原因是,我不想在我的项目中写出相同或相似的代码,即使是像上面这样简单的东西。
在类库中没有内置函数可以做到这一点。 最接近的是System.Math.Round() ,它仅用于将Decimal和Doubletypes的数字舍入为最接近的整数值。 不过,如果你正在使用.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 Framework的旧版本进行编程,只需从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);
这样,您可以select是否将间隔的一半舍入或舍入。 =)
将float四舍五入到整数类似于(int)(x + 0.5),而不是简单地使用x – 如果你想得到10的倍数,你可以很容易地适应这个。
如果你只是想做整数运算并将其舍入到10,可以尝试(x + 10/2)/ 10 * 10。
编辑:我注意到,这个回应不符合原作者的要求,也是我不愿意做的四舍五入forms。 然而,另一个接受的回应已经指出Math.round()是一个更好的解决scheme。
老问题,但这里是一个方法来做什么已经问,再加上我扩大了能够将任何数字四舍五入到你想要的数字。
private double Rounding(double d, int digits) { int neg = 1; if (d < 0) { d = d * (-1); neg = -1; } int n = 0; if (d > 1) { while (d > 1) { d = d / 10; n++; } d = Math.Round(d * Math.Pow(10, digits)); d = d * Math.Pow(10, n - digits); } else { while (d < 0.1) { d = d * 10; n++; } d = Math.Round(d * Math.Pow(10, digits)); d = d / Math.Pow(10, n + digits); } return d*neg; } private void testing() { double a = Rounding(1230435.34553,3); double b = Rounding(0.004567023523,4); double c = Rounding(-89032.5325,2); double d = Rounding(-0.123409,4); double e = Rounding(0.503522,1); Console.Write(a.ToString() + "\n" + b.ToString() + "\n" + c.ToString() + "\n" + d.ToString() + "\n" + e.ToString() + "\n"); }
我更喜欢不带Math
库也不去浮点数,所以我的build议是像下面的整数算术,我到下一个1K。 如果你不想重复的话,把它包装在一个方法或lambda片段中。
int MyRoundedUp1024Int = ((lSomeInteger + 1023) / 1024) * 1024;
我还没有对此进行性能testing与其他方式,但我敢打赌,这是最快的方法来做到这一点,除了可能转移和旋转的位版本。