-4

I want to round a number (up or down) in an inputted interval centered around 100 (not exactly on the multiples of the internal length). Here are some examples:

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 => The discrete interval is [..., 94, 100, 106,...] and the Output=106

I have an idea of generating the interval and then rolling though using a loop and finding the first value.

How would I do this in C#?

What I've tried:

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

The issue is that this looks at the multiples of the length, but it doesn't center it at 100.

I think I need something like this, but it needs to handle all cases of numbers:

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

That seems to work for numbers greater than Center, but fails in other cases.


EDIT: I think this works in all cases:

Result = Center + Length* (int) Math.Ceiling((Input - Center) / Length)
John Doe
  • 185
  • 1
  • 8

2 Answers2

0

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

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

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

John Doe
  • 185
  • 1
  • 8
0

I'd do something like this:

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;
}
simon at rcl
  • 7,326
  • 1
  • 17
  • 24