测试值是奇数还是偶数

时间:2011-06-02 07:19:02

标签: javascript numbers

我决定用一个非常简单的算法创建简单的 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 。它可能是一个带有严格标志的函数,但我认为不需要进行严格的比较。

23 个答案:

答案 0 :(得分:305)

使用模数:

function isEven(n) {
   return n % 2 == 0;
}

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

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

Number.isFinite(parseFloat(n))

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

答案 1 :(得分:67)

我更喜欢使用位测试:

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

测试第一位是否表示奇数。

答案 2 :(得分:7)

以下怎么样?我只在IE中对此进行了测试,但是很乐意处理表示任意长度数字的字符串,实际数字是整数或浮点数,并且当传递布尔值,未定义,空值,数组或对象时,这两个函数都返回false。 (在传入字符串时,是否要忽略前​​导或尾随空白 - 我认为它们被忽略并导致两个函数都返回false。)

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

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

答案 3 :(得分:7)

注意:也有负数。

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

,其中

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

答案 4 :(得分:4)

为什么不这样做:

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

答案 5 :(得分:2)

要完成Robert Brisita的位测试。

if ( ~i & 1 ) {
    // Even
}

答案 6 :(得分:1)

var isEven = function(number) {
    // Your code goes here!
    if (number % 2 == 0){
       return(true);
    }
    else{
       return(false);    
    }
};

答案 7 :(得分:1)

对Steve Mayne的简单修改/改进回答!

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

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

答案 8 :(得分:1)

一些

x % 2 == 0; // Check if even

!(x & 1); // bitmask the value with 1 then invert.

((x >> 1) << 1) == x; // divide value by 2 then multiply again and check against original value

~x&1; // flip the bits and bitmask

答案 9 :(得分:1)

为此,我们只需要一行代码!

这是一种更新的替代方法,对JS函数使用新的ES6语法,对if-else语句调用使用one-line syntax

const isEven = num => ((num % 2) == 0) ? true : false;

alert(isEven(8));  //true
alert(isEven(9));  //false
alert(isEven(-8)); //true

答案 10 :(得分:0)

var isOdd = x => Boolean(x % 2);
var isEven = x => !isOdd(x);

答案 11 :(得分:0)

for(var a=0; a<=20;a++){
   if(a%2!==0){
       console.log("Odd number "+a);
   }
}

for(var b=0; b<=20;a++){
    if(b%2===0){
        console.log("Even number "+b);  
    }     
 }

答案 12 :(得分:0)

var num = someNumber
    isEven;
parseInt(num/2) === num/2 ? isEven = true : isEven = false;

答案 13 :(得分:0)

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

答案 14 :(得分:0)

使用现代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)

答案 15 :(得分:0)

为了测试你是否有奇数或偶数,这也有效。

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

另外使用字符串,因为为什么不

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

答案 18 :(得分:0)

不同的方式:

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

isEven(69)

答案 19 :(得分:-1)

使用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;
}

答案 20 :(得分:-2)

function isEven(n) {return parseInt(n)%2===0?true:parseInt(n)===0?true:false}

当0 /甚至想要但

isEven(0) //true
isEven(1) //false
isEven(2) //true
isEven(142856) //true
isEven(142856.142857)//true
isEven(142857.1457)//false

答案 21 :(得分:-2)

if (i % 2) {
return odd numbers
}

if (i % 2 - 1) {
return even numbers
}

答案 22 :(得分:-2)

这个更简单!

  var num = 3 //instead get your value here
  var aa = ["Even", "Odd"];

  alert(aa[num % 2]);