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.