四舍五入到以 100 为中心的区间内最接近的数字

Round to the nearest number in an interval centered around 100

我想在以 100 为中心(不完全是内部长度的倍数)的输入区间内对数字进行四舍五入(向上或向下)。以下是一些示例:

Ex 1: Length=3, Center=100, Input=99.76, Round Down=True => The discrete interval is [..., 97, 100, 103,...] and the Output=97 .

Ex 2: Length=4, Center=100, Input=95.5, Round Down=False => The discrete interval is [..., 96, 100, 104,...] and the Output=96

Ex 3: Length=6, Center=100, Input=101.1, Round Down=False => 离散区间为 [..., 94, 100, 106,...] 并且输出=106

我想生成间隔,然后通过循环滚动并找到第一个值。

我如何在 C# 中执行此操作?

我尝试过的:

Result = Length* (int) Math.Ceiling(Input / Length)

问题是这会查看长度的倍数,但不会以 100 为中心。

我想我需要这样的东西,但它需要处理所有数字情况:

Result = Center + Length* (int) Math.Ceiling(Math.Abs(Center -Input) / Length)

这似乎适用于大于中心的数字,但在其他情况下失败。


编辑:我认为这适用于所有情况:

Result = Center + Length* (int) Math.Ceiling((Input - Center) / Length)

示例 1:100+3 * (int)Math.Floor((double)(99.76-100)/3) = 97

示例 2:100+4 * (int)Math.Ceiling((double)(95.5-100)/4) = 96

示例 3:100+6 * (int)Math.Ceiling((double)(101-100)/6)

我会这样做:

int Round(int length, int center, decimal input, bool roundDown)
{
    return length * (int)(roundDown ? Math.Floor((input - (decimal)center) / length) 
                                  : Math.Ceiling((input - (decimal)center) / length))
          + center;
}