Javascript 测试值是奇数还是偶数

Javascript 测试值是奇数还是偶数,javascript,numbers,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数字范围

我决定用一个非常简单的算法创建简单的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的最终版本。

使用模数:

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

function isOdd(n) {
   return Math.abs(n % 2) == 1;
}
您可以使用以下命令检查Javascript中的任何值是否可以强制为数字:

Number.isFinite(parseFloat(n))

最好在
isEven
isOdd
函数之外执行此检查,这样您就不必在这两个函数中重复错误处理。

以下内容如何?我只在IE中进行了测试,但它很乐意处理表示任意长度数字的字符串,实际数字是整数或浮点数,当传递布尔值、未定义值、null、数组或对象时,这两个函数都返回false。(传入字符串时是否要忽略前导空格或尾随空格取决于您-我假设它们不会被忽略,并导致两个函数都返回false。)


注:也有负数。

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


我更喜欢使用bit测试:

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

这将测试第一位是否为奇数。

这一位更简单

var isEven = function(number) {
    // Your code goes here!
    if (number % 2 == 0){
       return(true);
    }
    else{
       return(false);    
    }
};
  var num = 3 //instead get your value here
  var aa = ["Even", "Odd"];

  alert(aa[num % 2]);
不同的方式:

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

isEven(69)

Steve Mayne答案的简单修改/改进

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

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

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

function isEven(__num){
    return String(__num/2).indexOf('.') === -1;
}
为什么不这样做:

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

为了测试您是否有奇数或偶数,这也很有效

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

使用现代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)
也许是这个?
如果(我们的编号%2!==0)

我们只需要一行代码

下面是一种更新的替代方法,使用JS函数的新语法,以及
if-else
语句调用:

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

alert(isEven(8));  //true
alert(isEven(9));  //false
alert(isEven(-8)); //true
当0/甚至想要但是

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

完成罗伯特·布里西塔的钻头测试

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

x%2==0;//检查是否均匀
!(x&1);//位掩码值为1,然后反转。
((x>>1)
for(var a=0;a
var isOdd=x=>Boolean(x%2);
var isEven=x=>!isOdd(x);


0.1
NaN
与上面的函数配合得很好。空数组有点麻烦,因为它等于0…@Alin-我添加了一个数字检查。我不确定我是否理解您希望算术函数显式处理其他数据类型的场景,但如果这是OP想要的…更改
ret怎么样urn n==parseInt(n);
to
return n==parseInt(n);
?我想我在某个地方读到了当检查奇数时你应该检查的内容,因为它不一定是1,这取决于语言。编辑:啊,这就是
.abs
调用的目的。那就别管它了。@Andy Ray-你不能说!isEven(数字)对于isOdd,因为这意味着0.1是奇数,因为它不是偶数。对于我的实现,isEven(2.122e3)返回true,但isEven(“2.122e3”)返回false。相反,我的isEven()对于非常大的数字失败,因为JS在为正则表达式测试转换为字符串时将它们设置为指数格式。哦,好吧。@MartijnScheffer-请随时向我发送您需要购买的所有额外内存的账单。请注意,这个问题确实包括从其他类型到数字的转换,这显然是我建议h的重点这里将有一个简单的单行函数来处理数字和字符串。当然,根据我自己的评论,这实际上并不能处理所有可能的情况,但它仍然可能有用-正则表达式是验证用户输入的数据的最简单的方法,最初将是字符串。我在这里发表了评论吗?我看不到,但如果你想要的话,我可以!,这不是一个正确的解决方案,速度要慢几百倍,我们讨论的是数字而不是字符串,如果您想检查字符串是否是有效的数字,以及是否是可以单独处理的整数。@MartijnScheffer-是的,有您的评论,似乎在我回答后的某个时候被删除了。请注意,这个问题不是不仅仅是关于数字,OP的代码还包括其他类型的转换。无论如何,谢谢你的反馈。parseInt不需要基数吗?@Blabla是的,并不是所有的实现都假定基数为10。很好地引用了负值。Robert Brisita的答案(后来添加)也包括这一点。这将返回未定义的
num=-1
,没有任何解释。您的贡献没有多大价值。它还重复讨论中已经提供的信息。谢谢Cindy!只是提供了一个解决方案!但是…这实际上没有任何作用。它不应该返回什么吗?当然。使用modulu用于base-2数学的s应该是非法的;)三元:
i&1==1?console.log(“奇数”):console.log(“偶数”);
此外,+1表示位级效率(在JS中没有广泛使用)@Jacksonkr注意,没有“位级效率”在JavaScript中,因为所有数字在JavaScript中都是浮点数,使用位运算符意味着首先将其转换为int,然后执行该操作,然后再将其转换回浮点数。@它们属于数字类型,但很高兴知道强类型语言有效率。@AndrewCastellano正在测试单个位,而不是i的全部值。任何大于0的数字都将为真,但并不意味着它是奇数或偶数。请检查:并查看根据输入的数字展开的位。如果()返回真,否则返回假,则可能重复的
范例始终可以简化为
返回()const isEven = num => ((num % 2) == 0) ? true : false;

alert(isEven(8));  //true
alert(isEven(9));  //false
alert(isEven(-8)); //true
function isEven(n) {return parseInt(n)%2===0?true:parseInt(n)===0?true:false}
isEven(0) //true
isEven(1) //false
isEven(2) //true
isEven(142856) //true
isEven(142856.142857)//true
isEven(142857.1457)//false
if ( ~i & 1 ) {
    // Even
}
if (i % 2) {
return odd numbers
}

if (i % 2 - 1) {
return even numbers
}
var num = someNumber
    isEven;
parseInt(num/2) === num/2 ? isEven = true : isEven = false;
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