首页 文章

测试值是奇数还是偶数

提问于
浏览
131

我决定用一个非常简单的算法创建简单的isEven和isOdd函数:

function isEven(n) {
  n = Number(n);
  return n === 0 || !!(n && !(n%2));
}

function isOdd(n) {
  return isEven(Number(n) + 1);
}

如果n具有某些参数,则可以,但在许多情况下都会失败 . 因此,我开始创建强大的函数,为尽可能多的场景提供正确的结果,以便只测试javascript数量限制内的整数,其他所有内容都返回false(包括 - 和 - 无穷大) . 注意零是偶数 .

// Returns true if:
//
//    n is an integer that is evenly divisible by 2
//
// Zero (+/-0) is even
// Returns false if n is not an integer, not even or NaN
// Guard against empty string

(function (global) {

  function basicTests(n) {

    // Deal with empty string
    if (n === '') 
      return false;

    // Convert n to Number (may set to NaN)
    n = Number(n);

    // Deal with NaN
    if (isNaN(n)) 
      return false;

    // Deal with infinity - 
    if (n === Number.NEGATIVE_INFINITY || n === Number.POSITIVE_INFINITY)
      return false;

    // Return n as a number
    return n;
  }

  function isEven(n) {

    // Do basic tests
    if (basicTests(n) === false)
      return false;

    // Convert to Number and proceed
    n = Number(n);

    // Return true/false
    return n === 0 || !!(n && !(n%2));
  }
  global.isEven = isEven;

  // Returns true if n is an integer and (n+1) is even
  // Returns false if n is not an integer or (n+1) is not even
  // Empty string evaluates to zero so returns false (zero is even)
  function isOdd(n) {

    // Do basic tests
    if (basicTests(n) === false)
      return false;

    // Return true/false
    return n === 0 || !!(n && (n%2));
  }
  global.isOdd = isOdd;

}(this));

任何人都可以看到上述问题吗?是否有更好的(即更准确,更快或更简洁而不被混淆)版本?

有各种与其他语言相关的帖子,但我似乎找不到ECMAScript的最终版本 .

编辑

添加了代码审核标记,但我不是在进行代码审核之后 . 我发布了这些代码只是为了让别人看到我要去的地方,而不是要回顾一下 . 到目前为止发布的答案似乎得到了 .

编辑2

最终的功能,基于史蒂夫的回答:

// Use abstract equality == for "is number" test
function isEven(n) {
  return n == parseFloat(n)? !(n%2) : void 0;
}

// Use strict equality === for "is number" test
function isEvenStrict(n) {
  return n === parseFloat(n)? !(n%2) : void 0;
}

任何不是数字的东西都返回undefined,数字返回true或false . 它可能是一个带有严格标志的函数,但我认为严格的比较并不是真正需要的 .

15 回答

  • 7

    不同的方式:

    var isEven = function(number) {
      // Your code goes here!
      if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;};
    };
    
    isEven(69)
    
  • 4

    使用现代的javascript风格:

    const NUMBERS = "nul one two three four five six seven ocho nueve".split(" ")
    
    const isOdd  = n=> NUMBERS[n % 10].indexOf("e")!=-1
    const isEven = n=> isOdd(+n+1)
    
  • 0

    史蒂夫梅恩答案的简单修改/改进!

    function isEvenOrOdd(n){
        if(n === parseFloat(n)){
            return isNumber(n) && (n % 2 == 0);
        }
        return false;
    }
    

    注意:如果无效,则返回false!

  • 0

    我更喜欢使用一点测试:

    if(i & 1)
    {
        // ODD
    }
    else
    {
        // EVEN
    }
    

    这测试第一位是否表示奇数 .

  • -1

    要测试你是否有奇数或偶数,这也有效 .

    const comapare = x => integer(checkNumber(x));
    
    function checkNumber (x) {
       if (x % 2 == 0) {
           return true;
       } 
       else if (x % 2 != 0) {
           return false;
        }
    }
    
    function integer (x) {
       if (x) {
           console.log('even');
       } 
       else {
           console.log('odd');
        }
    }
    
  • 0
    var isEven = function(number) {
        // Your code goes here!
        if (number % 2 == 0){
           return(true);
        }
        else{
           return(false);    
        }
    };
    
  • 7

    注意: there are also negative numbers.

    function isOddInteger(n)
    {
       return isInteger(n) && (n % 2 !== 0);
    }
    

    哪里

    function isInteger(n)
    {
       return n === parseInt(n, 10);
    }
    
  • 60

    以下怎么样?我只在IE中对此进行了测试,但它很乐意处理表示任意长度数字的字符串,实际数字是整数或浮点数,并且当传递boolean,undefined,null,数组或对象时,两个函数都返回false . (在传入字符串时,是否要忽略前导或尾随空白取决于您 - 我假设它们不会被忽略并导致两个函数都返回false . )

    function isEven(n) {
       return /^-?\d*[02468]$/.test(n);
    }
    
    function isOdd(n) {
       return /^-?\d*[13579]$/.test(n);
    }
    
  • 286

    测试一个数字是否甚至使用JavaScript的简单方法

    function isEven(x) {
    //return true if even
    if (x % 2 === 0) {
        return true;
    }
    //return false otherwise
    else {
        return false
    }
    }
    // or much simpler
    function isEven(x) {
    return x % 2 === 0;
    }
    
  • 1

    使用模数:

    function isEven(n) {
       return n % 2 == 0;
    }
    
    function isOdd(n) {
       return Math.abs(n % 2) == 1;
    }
    

    您可以检查Javascript中的任何值是否都可以强制转换为以下数字:

    Number.isFinite(parseFloat(n))
    

    此检查最好在 isEvenisOdd 函数之外进行,因此您不必在两个函数中复制错误处理 .

  • 1
    if (testNum == 0);
    else if (testNum % 2  == 0);
    else if ((testNum % 2) != 0 );
    
  • 0

    这一个更简单!

    var num = 3 //instead get your value here
      var aa = ["Even", "Odd"];
    
      alert(aa[num % 2]);
    
  • 0

    其他使用字符串,因为为什么不

    function isEven(__num){
        return String(__num/2).indexOf('.') === -1;
    }
    
  • -2

    也许这个? if(ourNumber%2!== 0)

  • 0

    为什么不这样做:

    function oddOrEven(num){
            if(num % 2 == 0)
                return "even";
            return "odd";
        }
        oddOrEven(num);
    

相关问题