При проверке, находится ли «число» в диапазоне, вы должны четко понимать, что вы имеете в виду, и что означают два равных числа? В общем случае вы должны обернуть все числа с плавающей запятой в так называемый «эпсилон-шар», для этого нужно выбрать небольшое значение и сказать, что если два значения находятся слишком близко, это одно и то же.
private double _epsilon = 10E-9;
/// <summary>
/// Checks if the distance between two doubles is within an epsilon.
/// In general this should be used for determining equality between doubles.
/// </summary>
/// <param name="x0">The orgin of intrest</param>
/// <param name="x"> The point of intrest</param>
/// <param name="epsilon">The minimum distance between the points</param>
/// <returns>Returns true iff x in (x0-epsilon, x0+epsilon)</returns>
public static bool IsInNeghborhood(double x0, double x, double epsilon) => Abs(x0 - x) < epsilon;
public static bool AreEqual(double v0, double v1) => IsInNeghborhood(v0, v1, _epsilon);
С этими двумя помощниками на месте и предполагая, что если любое число может быть брошено как двойное без необходимой точности. Все, что вам сейчас нужно, это перечисление и другой метод
public enum BoundType
{
Open,
Closed,
OpenClosed,
ClosedOpen
}
Другой метод следующий:
public static bool InRange(double value, double upperBound, double lowerBound, BoundType bound = BoundType.Open)
{
bool inside = value < upperBound && value > lowerBound;
switch (bound)
{
case BoundType.Open:
return inside;
case BoundType.Closed:
return inside || AreEqual(value, upperBound) || AreEqual(value, lowerBound);
case BoundType.OpenClosed:
return inside || AreEqual(value, upperBound);
case BoundType.ClosedOpen:
return inside || AreEqual(value, lowerBound);
default:
throw new System.NotImplementedException("You forgot to do something");
}
}
Теперь это может быть намного больше, чем вы хотели, но это мешает вам постоянно иметь дело с округлением и попыткой вспомнить, округлено ли значение и до какого места. Если вам нужно, вы можете легко расширить это для работы с любым эпсилоном и позволить вашему эпсилону измениться.