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


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.