四舍五入到以 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;
}
我想在以 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;
}