Vérifier si une valeur se situe dans une plage de nombres

110

Je veux vérifier si une valeur est dans une plage acceptée. Si oui, faire quelque chose; sinon, autre chose.

La gamme est 0.001-0.009. Je sais comment utiliser plusieurs ifpour vérifier cela, mais je veux savoir s'il existe un moyen de le vérifier dans une seule ifdéclaration.

Sotiris
la source
14
&&opérateur? ...
Šime Vidas

Réponses:

218

Vous posez une question sur les comparaisons numériques, donc les expressions régulières n'ont vraiment rien à voir avec le problème. Vous n'avez pas besoin d' ifinstructions "multiples " pour le faire non plus:

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

Vous pouvez vous écrire une fonction "between ()":

function between(x, min, max) {
  return x >= min && x <= max;
}
// ...
if (between(x, 0.001, 0.009)) {
  // something
}
Pointu
la source
Votre codage est bon mais il ne répond pas à la question, c'est tout. Sans vouloir vous offenser. Je juge toujours une solution en fonction de sa réponse à la question. C'est parce que je suppose généralement que les gens savent ce qu'ils demandent. La coche me montre que ce n'était pas le cas avec ce questionneur.
Leif
7
Eh bien, j'apprécie ce que vous dites, mais je suggère que vous souhaitiez peut-être reconsidérer la prémisse selon laquelle les gens ici généralement «savent ce qu'ils demandent». Cela peut être vrai dans un sens très étroit , mais ces questions reflètent souvent une mauvaise décision de conception qui devrait être réexaminée. Je réponds aux questions de programmation depuis environ 30 ans maintenant, donc je l'ai vu à plusieurs reprises. Je préfère bien sûr de meilleures questions, dans lesquelles l'objectif global est clairement expliqué. Ici, nous n'avons vraiment aucune idée de la raison de la question, nous n'avons donc pas de contexte.
Pointy le
6
J'aime utiliser la syntaxe comme celle-ci: if (0.001 <= x && x <= 0.009) {...} me semble un peu plus clair :)
Omri
50

Voici une option avec une seule comparaison.

// 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
Alexandre
la source
C'est gentil, peu importe si min est inférieur ou max est inférieur, cela fonctionnera toujours. En fait, il serait peut-être préférable d'appeler min, max quelque chose comme start, end. super algo de toute façon merci!
James Harrington
19

Si vous devez utiliser une expression régulière (et vraiment, vous ne devriez pas!) Cela fonctionnera:

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

devrait fonctionner, c'est à dire

  • ^ rien avant,
  • suivi de 0.00(nb: échappement anti-slash pour le .caractère)
  • suivi de 1 à 8 et de n'importe quel nombre de chiffres supplémentaires
  • ou 9, suivi d'un nombre quelconque de zéros
  • $: suivi de rien d'autre
Alnitak
la source
8

Si vous utilisez déjà lodash, vous pouvez utiliser la inRange()fonction: 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
Haroldo_OK
la source
3

J'aime la betweenfonction de Pointy, alors j'en ai écrit une similaire qui a bien fonctionné pour mon scénario.

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

donc si vous vouliez voir si xétait à ± 10 y:

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

Je l'utilise pour détecter un appui long sur mobile:

//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);
L'avocat du diable
la source
1

Si vous souhaitez que votre code sélectionne une plage spécifique de chiffres, veillez à utiliser l' &&opérateur au lieu du ||.

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
}

Favoriser George
la source
0

Vous devez vouloir déterminer la limite inférieure et supérieure avant d'écrire la condition

function between(value,first,last) {

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

}
Steve KACOU
la source