-4

我想在以 100 为中心的输入间隔中舍入一个数字(向上或向下)(不完全是内部长度的倍数)。这里有些例子:

例 1:长度 = 3,中心 = 100,输入 = 99.76,向下取整 = True => 离散区间为 [..., 97, 100, 103,...] 并且输出 = 97。

Ex 2: Length=4, Center=100, Input=95.5, Round Down=False => 离散区间为 [..., 96, 100, 104,...] 和 Output=96

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

我有一个生成间隔的想法,然后使用循环滚动并找到第一个值。

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

我试过的:

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

问题是这看起来是长度的倍数,但它并不以 100 为中心。

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

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

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


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

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

2 回答 2

0

例 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)

于 2019-10-11T14:24:30.760 回答
0

我会做这样的事情:

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;
}
于 2019-10-11T14:33:33.310 回答