返回最接近的数字的多个值

mou*_*iec 7 c#

我需要一个函数,通过该函数我可以将数字转换为给定倍数的最接近值.

例如,我想要一个数字数组设置为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)

  • 使用“MidpointRounding.ToEven”,以便平均舍入误差将使值向上移动与向下移动一样多。始终远离零意味着经过多次计算错误会逐渐复合错误,直到您的值相差很远。但是,是的,这并不是您通常想要计算的最终显示值。 (3认同)

tza*_*man 7

你不需要做任何浮点除法,这是不必要的.使用余数运算符:

int rem = value % multiple;
int result = value - rem;
if (rem > (multiple / 2))
    result += multiple;
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 6

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(我曾错误地省略).


Nei*_*rao 5

如果四舍五入到最接近的浮点倍数,您可以使用以下方法:

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)