检查一个值是否在一定范围内的数字。

183
我想检查一个值是否在接受的范围内。如果是,就做某些事情;否则,做其他事情。

这个范围是0.001-0.009。我知道如何使用多个if来检查这个范围,但我想知道是否有任何方法可以在单个if语句中检查它。


18
&& 运算符是逻辑 AND 运算符,用于判断两个条件是否同时成立。如果两个条件都为真,则表达式的结果为真;否则为假。 - Šime Vidas
9个回答

336
你正在提问关于数字比较的问题,所以正则表达式与此问题无关。你也不需要使用“多重if”语句来解决它:

您询问有关数字比较的问题,因此正则表达式与该问题无关。 您也不需要使用“多个 if ”语句来解决它:

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

您可以自己编写一个“between()”函数:

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

1
你的编码很好,但它并不符合问题,仅此而已。没有冒犯之意。我总是根据解决方案对问题的回答程度来评判它的好坏。这是因为我通常认为人们知道自己在寻求什么。勾选标记告诉我,这个提问者并非如此。 - Leif
34
我理解您的意思,但我建议您重新考虑“人们普遍知道他们在寻找什么”这一前提。在非常狭义的意义上,这可能是正确的,但通常这些问题反映了一些不良设计决策,应该重新审视。我已经回答编程问题约30年了,所以我见过这种情况发生很多次。当然,我更喜欢更好的问题,其中总体目标得到清楚地解释。在这里,我们真的不知道问题的原因,所以我们没有上下文。 - Pointy
24
我喜欢使用这样的语法:if (0.001 <= x && x <= 0.009) {...},这对我来说更清晰易懂 :) - Omri

78

这里有一个仅需一次比较即可完成的选项。

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

4
这很棒,无论是min还是max更低,它仍然可以工作。实际上,将min和max称为start和end可能更好。无论如何,算法很棒,谢谢! - James Harrington
8
有没有人能关注时间复杂度啊!我会选择被接受的解决方案,因为两个 Θ(2) 的比较优于一个 O(4) 的比较和三次算术运算。 - Matt McCarthy
2
我从未声称它是你想象中的那样。然而,它仍然是一个可行的选择。 - Alexander
5
有些傻,不仅速度可能会更慢,而且代码的作用也不太明显。 - adrian

22

如果你必须使用正则表达式(但实际上,你不应该使用!),那么这个方法可以工作:

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

应该可以工作,即:

  • ^ 没有任何字符在前面,
  • 接下来是 0.00(注意:对于点号字符需要进行反斜杠转义),
  • 接着是1到8之间的数字,后跟任意数量的其他数字,
  • 或者是数字9,后跟任意数量的零,
  • $:仅后面没有其他字符。

19

如果您已经在使用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

4

我喜欢Pointy的between函数,因此我写了一个类似的函数,适用于我的情况。

/**
 * 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是否在y的±10范围内:

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);

4
如果您想让代码选择特定的数字范围,请确保使用&&运算符而不是||

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
}


4

在编写条件语句之前,您必须确定下限和上限。

function between(value,first,last) {

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

}

2

const inRange = (num, num1, num2) => Math.min(num1, num2) <= num && Math.max(num1, num2) >= num;

如果您想使inRange包括范围数字(num1、num2)并且不依赖于它们的顺序,可以像这样:


1

这里是一个简短的ES6函数:

const inRange = (num, min, max) => num >= min && num <= max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接