Проверьте, находится ли значение в диапазоне чисел


111

Я хочу проверить, находится ли значение в допустимом диапазоне. Если да, что-то делать; иначе что-нибудь другое.

Диапазон есть 0.001-0.009. Я знаю, как использовать несколько, ifчтобы проверить это, но я хочу знать, есть ли способ проверить это с помощью одного ifоператора.


14
&&оператор? ...
— Шиме Видас

Ответы:


219

Вы задаете вопрос о числовых сравнениях, поэтому регулярные выражения не имеют никакого отношения к проблеме. Для этого вам также не нужны "множественные if" операторы:

if (x >= 0.001 && x <= 0.009) {
  // something
}

Вы можете написать себе функцию "между ()":

function between(x, min, max) {
  return x >= min && x <= max;
}
// ...
if (between(x, 0.001, 0.009)) {
  // something
}

1
У вас хорошее кодирование, но это не подходит под вопрос, вот и все. Без обид. Я всегда сужу о решении по тому, насколько хорошо оно отвечает на вопрос. Это потому, что я обычно предполагаю, что люди знают, о чем они просят. Галочка показывает мне, что с этим вопросом не было.
— Leif

7
Что ж, я ценю то, что вы говорите, но я предлагаю вам пересмотреть предположение, что люди здесь обычно «знают, о чем они просят». Это может быть правдой в очень узком смысле, но часто эти вопросы отражают некое неудачное дизайнерское решение, к которому следует вернуться. Я отвечаю на вопросы программирования уже около 30 лет, так что видел, как это случалось много раз. Я, конечно, предпочитаю вопросы получше, в которых общая цель четко объясняется. Здесь мы действительно понятия не имеем о причине вопроса, поэтому у нас нет контекста.
— Pointy

6
Мне нравится использовать такой синтаксис: if (0.001 <= x && x <= 0.009) {...} мне кажется немного понятнее :)
— Омри

50

Вот вариант с единственным сравнением.

// return true if in range, otherwise false
function inRange(x, min, max) {
    return ((x-min)*(x-max) <= 0);
}

console.log(inRange(5, 1, 10));     // true
console.log(inRange(-5, 1, 10));    // false
console.log(inRange(20, 1, 10));    // false

Это мило, неважно, если min меньше или max меньше, он все равно будет работать. На самом деле, может быть лучше называть min, max что-то вроде start, end. отличный алгоритм в любом случае спасибо!
— Джеймс Харрингтон

Кто-нибудь, ПОЖАЛУЙСТА, не подумает о временной сложности !? Я бы пошел с принятым решением, потому что два сравнения на (2) лучше, чем одно сравнение и три арифметических операции на O (4).
— Мэтт Маккарти,

Я никогда не утверждал, что это то, чем вы себя представляли. Тем не менее, это реальный вариант.
— Александр

19

Если вам необходимо использовать регулярное выражение (а на самом деле не следует!), Это сработает:

/^0\.00([1-8]\d*|90*)$/

должно работать, т.е.

  • ^ ничего раньше,
  • за которым следует 0.00(nb: обратная косая черта для .символа)
  • за которыми следуют от 1 до 8 и любое количество дополнительных цифр
  • или 9 с любым количеством нулей
  • $: за которым больше ничего

8

Если вы уже используете lodash, вы можете использовать inRange()функцию: https://lodash.com/docs/4.17.15#inRange

_.inRange(3, 2, 4);
// => true

_.inRange(4, 8);
// => true

_.inRange(4, 2);
// => false

_.inRange(2, 2);
// => false

_.inRange(1.2, 2);
// => true

_.inRange(5.2, 4);
// => false

_.inRange(-3, -2, -6);
// => true

3

Мне нравится betweenфункция Pointy, поэтому я написал похожую, которая хорошо работает в моем сценарии.

/**
 * Checks if an integer is within ±x another integer.
 * @param {int} op - The integer in question
 * @param {int} target - The integer to compare to
 * @param {int} range - the range ±
 */
function nearInt(op, target, range) {
    return op < target + range && op > target - range;
}

поэтому, если вы хотите увидеть, находится ли оно в xпределах ± 10 от y:

var x = 100;
var y = 115;
nearInt(x,y,10) = false

Я использую его для определения длительного нажатия на мобильном телефоне:

//make sure they haven't moved too much during long press.
if (!nearInt(Last.x,Start.x,5) || !nearInt(Last.y, Start.y,5)) clearTimeout(t);

1

Если вы хотите, чтобы ваш код выбирал определенный диапазон цифр, обязательно используйте &&оператор вместо ||.

if (x >= 4 && x <= 9) {
  // do something
} else {
  // do something else
}

// be sure not to do this

if (x >= 4 || x <= 9) {
  // do something
} else {
  // do something else
}


0

Вы должны определить нижнюю и верхнюю границу, прежде чем писать условие

function between(value,first,last) {

 let lower = Math.min(first,last) , upper = Math.max(first,last);
 return value >= lower &&  value <= upper ;

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.