【问题标题】:Check if a value is within a range of numbers检查一个值是否在一个数字范围内
【发布时间】:2011-06-23 12:44:55
【问题描述】:

我想检查一个值是否在可接受的范围内。如果是,做某事;否则,别的东西。

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

【问题讨论】:

  • && 运营商? ...

标签: javascript if-statement


【解决方案1】:

您是在问一个关于数字比较的问题,所以正则表达式实际上与这个问题无关。您也不需要“多个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
}

【讨论】:

  • 您的编码很好,但不符合问题,仅此而已。没有冒犯的意思。我总是根据它回答问题的好坏来判断一个解决方案。那是因为我通常假设人们知道他们想要什么。复选标记告诉我,这个提问者不是这种情况。
  • 嗯,我很欣赏你所说的,但我建议你可能需要重新考虑这里的人们通常“知道他们要求什么”的前提。这在非常狭义的意义上可能是正确的,但这些问题通常反映了一些应该重新审视的错误设计决策。我已经回答编程问题大约 30 年了,所以我已经看到它发生了很多次。我当然更喜欢更好的问题,其中清楚地解释了总体目标。在这里,我们真的不知道问题的原因,所以我们没有上下文。
  • 我喜欢使用这样的语法:if (0.001
【解决方案2】:

这是一个只有一次比较的选项。

// 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 之类的 start、end。无论哪种方式都很棒,谢谢!
  • 不会有人请考虑时间复杂度!?我会采用公认的解决方案,因为 Θ(2) 的两个比较优于一个比较和 O(4) 的三个算术运算。
  • 我从来没有声称它是你想象的那样。不过,这是一个可行的选择。
  • 这有点傻,它不仅可能更慢,而且代码的作用也不太明显
【解决方案3】:

如果您必须使用正则表达式(实际上,您不应该!)这将起作用:

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

应该工作,即

  • ^ 之前什么都没有,
  • 后跟0.00(注意:. 字符的反斜杠转义)
  • 后跟 1 到 8,以及任意数量的附加数字
  • 或 9,后跟任意数量的零
  • $: 后面没有别的了

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我喜欢 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);
      

      【讨论】:

        【解决方案6】:

        在编写条件之前,你必须要确定下限和上限

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

        【讨论】:

          【解决方案7】:

          如果您希望代码选择特定范围的数字,请务必使用 &amp;&amp; 运算符而不是 ||

          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
          }

          【讨论】:

            【解决方案8】:

            const inRange = (num, num1, num2) =&gt; Math.min(num1, num2) &lt;= num &amp;&amp; Math.max(num1, num2) &gt;= num;

            如果您想让 inRange 包含在内而不依赖于范围数字的顺序(num1,num2),则可能是这样。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多