我需要一个函数,通过该函数我可以将数字转换为给定倍数的最接近值.
例如,我想要一个数字数组设置为16的neareast倍数,所以2 = 0,5 = 0,11 = 16,17 = 16,30 = 32等
谢谢
Aar*_*ght 28
一些除法和舍入应该是你需要的所有:
int value = 30;
int factor = 16;
int nearestMultiple =
(int)Math.Round(
(value / (double)factor),
MidpointRounding.AwayFromZero
) * factor;
Run Code Online (Sandbox Code Playgroud)
小心使用这种技术.该Math.Round(double)超载认为邪恶的突变体MidpointRounding.ToEven是最好的默认行为,即使我们都在学校里学过是什么CLR调用MidpointRounding.AwayFromZero.例如:
var x = Math.Round(1.5); // x is 2.0, like you'd expect
x = Math.Round(0.5); // x is 0. WAT?!
Run Code Online (Sandbox Code Playgroud)
你不需要做任何浮点除法,这是不必要的.使用余数运算符:
int rem = value % multiple;
int result = value - rem;
if (rem > (multiple / 2))
result += multiple;
Run Code Online (Sandbox Code Playgroud)
16*((n+8)/16)是你想要的公式,特别是你要将8转换为16(它同样接近0到16,所以不可能根据"最接近的多个"概念决定如何转换它,你必须决定! - ),当然一直是24到32,40到48,等等.如果您宁愿将8转换为0而不是转换为16(并始终为24到16,依此类推),请使用+7代替+8.
要使用泛型X来代替硬编码16,那么公式是X*((n+X/2)/X)(如果X是偶数,则与上段相同的附带条件).
编辑:无须更动浮点数其他答案建议,但你也需要乘回来X(我曾错误地省略).
如果四舍五入到最接近的浮点倍数,您可以使用以下方法:
public static float convert(float value, float multipleOf)
{
return (float) Math.Round((decimal)value / (decimal)multipleOf, MidpointRounding.AwayFromZero) * multipleOf;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用该函数:
Console.WriteLine("Convert 10.723: " + convert(10.723f, 0.5f)); // 10.5
Run Code Online (Sandbox Code Playgroud)