Округление до ближайшего числа с интервалом около 100 - PullRequest
0 голосов
/ 11 октября 2019

Я хочу округлить число (вверх или вниз) во введенном интервале с центром в районе 100 (не совсем по кратным внутренней длине). Вот несколько примеров:

Пример 1: Длина = 3, Центр = 100, Вход = 99.76, Округление вниз = Истина => Дискретный интервал равен [..., 97, 100, 103, ... ] и Выход = 97.

Пример 2: Длина = 4, Центр = 100, Вход = 95,5, Округление вниз = Ложь => Дискретный интервал равен [..., 96, 100, 104 ,. ..] и Выход = 96

Пример 3: Длина = 6, Центр = 100, Вход = 101,1, Округление вниз = Ложь => Дискретный интервал равен [..., 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)

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Я бы сделал что-то вроде этого:

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;
}
0 голосов
/ 11 октября 2019

Пример 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)

...