如何在C#中将任何值四舍五入到10个间隔?例如,如果我有11,我希望它返回10,如果我有136,那么我希望它返回140。
我可以轻松地手工完成
return ((int)(number / 10)) * 10;
但是我正在寻找一种内置算法来完成这项工作,例如Math.Round()。我不愿意手工做的原因是,我不想为我的整个项目编写相同或相似的代码,即使是像上面这样简单的事情也是如此。
如何在C#中将任何值四舍五入到10个间隔?例如,如果我有11,我希望它返回10,如果我有136,那么我希望它返回140。
我可以轻松地手工完成
return ((int)(number / 10)) * 10;
但是我正在寻找一种内置算法来完成这项工作,例如Math.Round()。我不愿意手工做的原因是,我不想为我的整个项目编写相同或相似的代码,即使是像上面这样简单的事情也是如此。
Answers:
类库中没有内置函数可以执行此操作。最接近的是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()
。
使用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的本能
这可能为时已晚,但我想有一天可能会有所帮助...
我已经试过了:
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);
这样,您可以选择是否将间隔的一半向上舍入或向下舍入。=)
将浮点数舍入为整数类似于(int)(x + 0.5),而不是简单地强制转换x-如果您想要10的倍数,则可以轻松地对其进行调整。
如果您只想进行整数运算并将其舍入到十,请尝试(x + 10/2)/ 10 * 10。
编辑:我注意到此回复不符合原始作者的要求,并且也是我不愿意做的有偏见的四舍五入形式。但是,另一个已接受的响应已经说明了Math.round(),这是一个更好的解决方案。
旧问题,但这是一种解决所要求问题的方法,我将其扩展为可以将任意数字四舍五入为所需的无花果数量。
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");
}