Verifique se um valor está dentro de um intervalo de números


110

Quero verificar se um valor está em um intervalo aceito. Se sim, para fazer algo; caso contrário, outra coisa.

O intervalo é 0.001-0.009. Eu sei como usar múltiplo ifpara verificar isso, mas quero saber se existe alguma maneira de verificar em uma única ifinstrução.


14
&&operador? ...
Šime Vidas

Respostas:


218

Você está fazendo uma pergunta sobre comparações numéricas, então as expressões regulares realmente não têm nada a ver com o problema. Você não precisa de "múltiplas if" instruções para fazer isso:

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

Você poderia escrever uma função "entre ()":

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

Sua codificação é boa, mas não se encaixa na pergunta, só isso. Sem ofensa. Sempre julgo uma solução pela qualidade de sua resposta à pergunta. Isso porque geralmente presumo que as pessoas sabem o que estão pedindo. A marca de seleção mostra que este não foi o caso com este questionador.
Leif

7
Bem, eu aprecio o que você está dizendo, mas sugiro que você possa reconsiderar a premissa de que as pessoas aqui geralmente "sabem o que estão pedindo". Isso pode ser verdade em um sentido muito restrito , mas muitas vezes essas perguntas refletem alguma decisão de design ruim que deve ser revisada. Eu tenho respondido a perguntas de programação por cerca de 30 anos, então eu vi isso acontecer muitas vezes. É claro que prefiro perguntas melhores, nas quais o objetivo geral seja claramente explicado. Aqui, realmente não temos ideia do motivo da pergunta, portanto, não temos contexto.
Pointy de

6
Gosto de usar a sintaxe como esta: if (0,001 <= x && x <= 0,009) {...} parece um pouco mais claro para mim :)
Omri

50

Aqui está uma opção com apenas uma única comparação.

// 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

Isso é doce, não importa se o mínimo é menor ou o máximo é menor, ainda funcionará. Na verdade, pode ser melhor chamar min, max de algo como início, fim. ótimo algo de qualquer maneira, obrigado!
James Harrington

19

Se você deve usar uma regexp (e realmente, você não deveria!), Isso funcionará:

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

deve funcionar, ou seja

  • ^ nada antes,
  • seguido por 0.00(nb: escape de barra invertida para o .caractere)
  • seguido de 1 a 8 e qualquer número de dígitos adicionais
  • ou 9, seguido por qualquer número de zeros
  • $: seguido por nada mais

8

Se já estiver usando lodash, você pode usar a inRange()função: 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

Gosto da betweenfunção de Pointy, então escrevi uma semelhante que funcionou bem para o meu cenário.

/**
 * 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;
}

então se você quisesse ver se xestava dentro de ± 10 de y:

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

Estou usando para detectar um toque longo no celular:

//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

Se você quiser que seu código escolha um intervalo específico de dígitos, certifique-se de usar a &&operadora em vez de ||.

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

Você deve querer determinar o limite inferior e superior antes de escrever a condição

function between(value,first,last) {

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

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.