如何确定JavaScript中数字是否为奇数


245

谁能指出一些代码来确定JavaScript中的数字是偶数还是奇数?



1
@DavidThomas我部分同意,但是我有两个警告:1.如果必须选择,我宁愿是一个初学者,也%要比* 了解操作员&,以及2.虽然&理论上更快,但这并不重要
kojiro 2012年

3
@kojiro:我希望向学习者提供更多(有效)选项;再加上我以前从未想过以这种方式使用逐位&,所以这是一个有趣的选择。无论如何,由于它骗子,所以我已标记为与先前存在的问题合并。希望这里的答案(至少是该特定答案)不会丢失。
大卫说恢复莫妮卡(Monica)

1
@kojiro我怕说你的小提琴是没有用的,因为大部分的计算时间都由函数调用占用。但是没有人会使用函数调用来确定数字是奇数还是偶数...我对您的测试进行了第三次修订,但是我现在正在使用手机...
MaxArt 2012年

Answers:


346

使用以下代码:

function isOdd(num) { return num % 2;}
console.log("1 is " + isOdd(1));
console.log("2 is " + isOdd(2));
console.log("3 is " + isOdd(3));
console.log("4 is " + isOdd(4));

1代表奇数,0代表偶数。


97
请注意,这将返回01(或者,NaN如果您输入的不是数字并且不能强制为1),则在大多数情况下都可以正常工作。但是,如果您想要一个真实的truefalsereturn (num % 2) == 1;
TJ Crowder

3
是的,有关NaN的注意事项。但是通常,您希望javascript是真实的还是假的,这就是为什么我以这种方式编写它的原因。
CHII

9
为了清楚起见,取模运算符(%)给出除法的余数。所以3%2将是3/2,留下1作为剩余部分,因此3%2将返回1
Abuh

6
除了TJ所说的,如果num不是整数,这将返回分数。如果您进行比较,那仍然可以使用isOdd(1.5)==true(因为分数不等于true),但是如果函数返回truefalse由名称“ isOdd”暗示,则更好。
nnnnnn 2012年

6
您也可以return !!(num % 2)取得布林
邓肯

115

使用按位运算AND符。

function oddOrEven(x) {
  return ( x & 1 ) ? "odd" : "even";
}

function checkNumber(argNumber) {
  document.getElementById("result").innerHTML = "Number " + argNumber + " is " + oddOrEven(argNumber);
}
 
checkNumber(17);
<div id="result" style="font-size:150%;text-shadow: 1px 1px 2px #CE5937;" ></div>

如果您不希望字符串返回值,而是布尔值,请使用以下命令:

var isOdd = function(x) { return x & 1; };
var isEven  = function(x) { return !( x & 1 ); };

5
+1,您的回答肯定比我的要好,更不用说您只有一个使用的答案X % Y
s0d4pop 2012年

4
我不确定我的测试是否准确,但是按位AND似乎比固定数模运算符慢40倍,而对于随机数则慢2倍:jsperf.com/odd-or-even
Blender

8
请注意,对于两者都不是的数字(例如3.14),这将返回“奇数”或“偶数”。
nnnnnn

2
或:function isEven(n){return !(n & 1);}
RobG

7
@Gnuey每个数字都由一系列位组成。所有奇数的最低有效位(最右边)均设置为1,所有偶数均设置为0。x & 1检查是否在该数字中设置了最后一位(因为1是一个除最低有效位以外所有位均设置为1的数字):如果,则数字为奇数,否则为偶数。
0x499602D2 2013年

31

您可以执行以下操作:

function isEven(value){
    if (value%2 == 0)
        return true;
    else
        return false;
}

9
似乎您不知道布尔是什么。 if (condition) { answer=true; } else { answer=false; }只是的不必要的罗word版本answer = (bool) condition;。减少您的功能function isEven(value) { return (bool) (value%2 == 0); },我们都会很高兴。
2011年

9
无需变得笨拙,因为我编程的方式有所不同。
TNC

5
@awm -好像不知道的JavaScript。您不能将强制转换为布尔值(bool)(这将产生错误),并且在任何情况下都不需要:return value%2 == 0;将执行此==操作,因为运算符返回布尔值。
nnnnnn 2012年

2
哇,我真的写过吗?是的,那显然是错误的。应该是这样的answer = !!(condition)。当然,我要说的是,您可以return value%2==0并且不需要打扰有条件的人。
2012年

我觉得很优雅: value%2===0
carlodurso


13

我是否必须将一个具有很多偶数的数组做得非常大?

否。使用模量(%)。它为您提供了要除以的两个数字的余数。

Ex. 2 % 2 = 0 because 2/2 = 1 with 0 remainder.

Ex2. 3 % 2 = 1 because 3/2 = 1 with 1 remainder.

Ex3. -7 % 2 = -1 because -7/2 = -3 with -1 remainder.

这意味着,如果将x乘以2,则得到0或1或-1。0表示是偶数。其他什么都意味着奇怪。


8

可以用一小段代码解决:

function isEven(value) {
    if (value%2 == 0)
    return true;
else
    return false;
}

希望这可以帮助 :)


6

像许多语言一样,Javascript有一个模运算符%,可以找到除法的余数。如果除以2后没有余数,则数字为偶数:

// this expression is true if "number" is even, false otherwise
(number % 2 == 0)

这是测试偶数整数的非常常见的习惯用法。


3
但是,对于负值,模数可能比较棘手/不确定。请确保参考适当的语言规范。


5

您可以传递一个简单的功能。使用模运算符%

var is_even = function(x) {
    return !(x % 2); 
}

is_even(3)
false
is_even(6)
true

1
如果您在三元运算符中的结果为“ true”或“ false”,则您实际上不需要三元运算符。在这里,您可以/应该做:return !(x % 2);
dom_watson

4

使用我的扩展名:

Number.prototype.isEven=function(){
     return this % 2===0;
};

Number.prototype.isOdd=function(){
     return !this.isEven();
}

然后

var a=5; 
 a.isEven();

==假

 a.isOdd();

==真

如果不确定它是否为数字,请通过以下分支进行测试:

if(a.isOdd){
    a.isOdd();
}

更新:

如果您不使用变量:

(5).isOdd()

性能:

事实证明,过程范式优于OOP范式。顺便说一下,我在此FIDDLE中执行了 性能分析。但是,OOP方式仍然是最漂亮的。

在此处输入图片说明


谢谢杜德,对于这种逻辑,在受访者中有人问这种逻辑,无法回答,现在我明白了,谢谢..但是采用这种方法对绩效有好处吗?我们可以写isEven(x); 等
Shoib Mohammed 2015年

@ShoibMohammedA:比较已经完成!jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI

-1不扩展本机原型功能。(stackoverflow.com/questions/14034180/...
tfmontague

3

递归地减去2,直到达到-1或0(显然仅适用于正整数):)


使用负数时,您改为增加2
Hydroper

而且当n = 2 ^ 52时需要花费很多时间,而对于n> 2 ^ 53则需要无穷的时间
rioV8

3

您可以使用for语句和条件语句来确定一个数字或一系列数字是否为奇数:

for (var i=1; i<=5; i++) 
if (i%2 !== 0) {
    console.log(i)
}

这将打印1到5之间的每个奇数。


3

刚刚在Adobe Dreamweaver中执行了此操作。我用if(isNaN(mynmb))

检查给定的值是否为数字,我还使用 Math.abs(mynmb%2)将负数转换为正数并计算

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

</head>
<body bgcolor = "#FFFFCC">
    <h3 align ="center"> ODD OR EVEN </h3><table cellspacing = "2" cellpadding = "5" bgcolor="palegreen">
        <form name = formtwo>
            <td align = "center">
                <center><BR />Enter a number: 
                    <input type=text id="enter" name=enter maxlength="10" />
                    <input type=button name = b3 value = "Click Here" onClick = compute() />
                      <b>is<b> 
                <input type=text id="outtxt" name=output size="5" value="" disabled /> </b></b></center><b><b>
                <BR /><BR />
            </b></b></td></form>
        </table>

    <script type='text/javascript'>

        function compute()
        {
          var enter = document.getElementById("enter");
          var outtxt = document.getElementById("outtxt");

          var mynmb = enter.value;
          if (isNaN(mynmb)) 
          { 
            outtxt.value = "error !!!"; 
            alert( 'please enter a valid number');
            enter.focus();
            return;
          }
          else 
          { 
             if ( mynmb%2 == 0 ) { outtxt.value = "Even"; }  
             if ( Math.abs(mynmb%2) == 1 ) { outtxt.value = "Odd"; }
          }
        }

    </script>
</body>
</html>

3
   <script>
        function even_odd(){
            var num =   document.getElementById('number').value;

            if ( num % 2){
                document.getElementById('result').innerHTML = "Entered Number is Odd";
            }
            else{
                document.getElementById('result').innerHTML = "Entered Number is Even";
            }
        }
    </script>
</head>
<body>
    <center>
        <div id="error"></div>
        <center>
            <h2> Find Given Number is Even or Odd </h2>
            <p>Enter a value</p>
            <input type="text" id="number" />
            <button onclick="even_odd();">Check</button><br />
            <div id="result"><b></b></div>
        </center>
    </center>
</body>

2
if (X % 2 === 0){
} else {
}

将X替换为您的数字(可以来自变量)。如果数字为偶数,则运行If语句,否则为奇数。

如果您只想知道给定的数字是否为奇数:

if (X % 2 !== 0){
}

同样,用数字或变量替换X。



2

这个怎么样...

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

    alert(aa[num % 2]);

2

这就是我所做的

//Array of numbers
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,32,23,643,67,5876,6345,34,3453];
//Array of even numbers
var evenNumbers = [];
//Array of odd numbers
var oddNumbers = [];

function classifyNumbers(arr){
  //go through the numbers one by one
  for(var i=0; i<=arr.length-1; i++){
     if (arr[i] % 2 == 0 ){
        //Push the number to the evenNumbers array
        evenNumbers.push(arr[i]);
     } else {
        //Push the number to the oddNumbers array
        oddNumbers.push(arr[i]);
     }
  }
}

classifyNumbers(numbers);

console.log('Even numbers: ' + evenNumbers);
console.log('Odd numbers: ' + oddNumbers);

由于某种原因,我必须确保数组的长度小于一。当我不这样做时,我在oddNumbers数组的最后一个元素中得到“未定义”。


2
这是因为条件设置为小于或等于数组的长度“ <=”。我删除了等号,结果是所希望的。
Zakher Masri

2

当需要测试某个变量是否为奇数时,应首先测试它是否为integer。另外,请注意,当您计算负数的余数时,结果将为负(-3 % 2 === -1)。

function isOdd(value) {
  return typeof value === "number" && // value should be a number
    isFinite(value) &&                // value should be finite
    Math.floor(value) === value &&    // value should be integer
    value % 2 !== 0;                  // value should not be even
}

如果Number.isInteger可用,您还可以将此代码简化为:

function isOdd(value) {
  return Number.isInteger(value)      // value should be integer
    value % 2 !== 0;                  // value should not be even
}

注意:此处,我们测试value % 2 !== 0而不是value % 2 === 1因为-3 % 2 === -1。如果您不想-1通过此测试,则可能需要更改此行。

以下是一些测试案例:

isOdd();         // false
isOdd("string"); // false
isOdd(Infinity); // false
isOdd(NaN);      // false
isOdd(0);        // false
isOdd(1.1);      // false
isOdd("1");      // false
isOdd(1);        // true
isOdd(-1);       // true

2

使用 %将帮助您做到这一点...

您可以创建几个函数来为您做这些...我更喜欢separte函数,它不像Javascript那样附加到Number上,它还会检查您是否传递数字:

奇数函数:

var isOdd = function(num) {
  return 'number'!==typeof num ? 'NaN' : !!(num % 2);
};

偶函数:

var isEven = function(num) {
  return isOdd(num)==='NaN' ? isOdd(num) : !isOdd(num);
};

并这样称呼它:

isOdd(5); // true
isOdd(6); // false
isOdd(12); // false
isOdd(18); // false
isEven(18); // true
isEven('18'); // 'NaN'
isEven('17'); // 'NaN'
isOdd(null); // 'NaN'
isEven('100'); // true

2

ES6中的一根衬垫只是因为它很干净。

const isEven = (num) => num % 2 == 0;


2

许多人误解了奇数的含义

  • isOdd("str")应该是假的。
    只有整数可以是奇数。
  • isOdd(1.223)并且isOdd(-1.223)应该是错误的。
    浮点数不是整数。
  • isOdd(0)应该是假的。
    零是一个偶数整数(https://en.wikipedia.org/wiki/Parity_of_zero)。
  • isOdd(-1)应该是真的。
    这是一个奇数整数。

function isOdd(n) {

  // Must be a number
  if (isNaN(n)) {
    return false;
  }

  // Number must not be a float
  if ((n % 1) !== 0) {
    return false;
  }

  // Integer must not be equal to zero
  if (n === 0) {
    return false;
  }

  // Integer must be odd
  if ((n % 2) !== 0) {
    return true;
  }

  return false;
}

JS小提琴(如果需要):https : //jsfiddle.net/9dzdv593/8/

1线

Javascript 1-线性解决方案。对于那些不关心可读性的人。

const isOdd = n => !(isNaN(n) && ((n % 1) !== 0) && (n === 0)) && ((n % 2) !== 0) ? true : false;

您可以加快解决方案。即,在最后的语句中,您可以仅返回!!(n%2),这将使其有选择地使用带符号的数字(即,当n%2返回0时,它是错误的,但是当返回-1或1时,这将是错误的)。返回true)。您的解决方案实际上是针对奇数返回false,因为它正在检查模数返回是否为0,但应检查是否为1,而对于负数则返回1失败,因此返回!!(n%2)更安全。无论如何,{}(block语句)不会引起最小化问题,因此不会出现在讨论中。
Hydroper

@TheProHands-感谢您的笔记。(1)问题是模数版本有错字;应该是(n % 2) !== 0代替了(n % 2) === 0。(2)我的建议是避免使用!!(n % 2),因为(a)它的性能比(n % 2) !== 0jsperf.com/notnot-vs-strict-not)慢,(b)是骇客-将胁迫值强制0转换为false和(c)这是晦涩的(出于性能考虑,高级编程语言不应像Pascal那样阅读-这是编译器的工作)。(3)是的,缺少{}语句块确实会导致多个问题(在我的回答中已更新)。
tfmontague

我从不避免使用块语句,因为我关心的是可读性,但是我试图告诉人们,寻求块语句不会导致问题,而只会导致代码维护。即,使用序列表达式与表达式语句,而不是语句块合并可能使代码不可读和丑陋的,即:if (0) call1(), assign = 0, call2(),但单一的说法是不坏的:if (0) return; if (0) ;; if (0); break; if (0) continue;和我反正宁愿继续使用断线行语句块当我长期内联条件。
Hydroper

类型/ null检查喜欢你isNaN(n)是愚蠢的-一定要覆盖的NaN情况下,但是isOdd(null)isOdd(undefined)isOdd({x:1})所有的回报false,我认为是一个错误; 除非您当然只指定函数在给定域上具有正确的行为:仅数字类型输入。在这种情况下,只需放下isNaN支票并强制用户以正确的类型调用它。防御性编程太糟糕了。然后,您的函数将简化为isOdd = x => Math.floor(x) === x && x & 1 === 1– 无需返回显式truefalse
谢谢您

nullundefined和对象{}都没有奇数,因此该函数返回false-不知道为什么你认为一个错误。该isNaN检查是为了提高性能(而不是为了防御),它使函数过早退出而不执行其他检查。
tfmontague '19

1

我会实现此方法以返回布尔值:

function isOdd (n) {
    return !!(n % 2);
    // or ((n % 2) !== 0).
}

它将同时适用于未签名和已签名的数字。当模数返回-11将转换为true

非模量解决方案:

var is_finite = isFinite;
var is_nan = isNaN;

function isOdd (discriminant) {
    if (is_nan(discriminant) && !is_finite(discriminant)) {
        return false;
    }

    // Unsigned numbers
    if (discriminant >= 0) {
        while (discriminant >= 1) discriminant -= 2;

    // Signed numbers
    } else {
        if (discriminant === -1) return true;
        while (discriminant <= -1) discriminant += 2;
    }

    return !!discriminant;
}

1

现代javascript中更具功能性的方法:

const NUMBERS = "nul one two three four five six seven ocho nueve".split(" ")

const negate = f=> (...args)=> !f(...args)
const isOdd  = n=> NUMBERS[n % 10].indexOf("e")!=-1
const isEven = negate(isOdd)

1

在ES6中:

const isOdd = num => num % 2 == 1;


3
当为一个已有8年的旧问题添加一个答案并有26个现有答案时,解释您的答案所涉及的问题的新方面以及时间的流逝和新版本是否会影响答案确实很有用。仅提供代码的答案几乎总是可以通过添加一些说明来改善,在这种情况下,某些示例调用将显示用法。
杰森·艾勒

1
标题为“如何确定JavaScript中的数字是否为奇数”,并且没有针对要求的内容发布ES6解决方案。
Darryl Mendonez


0

这适用于数组:

function evenOrOdd(numbers) {
  const evenNumbers = [];
  const oddNumbers = [];
  numbers.forEach(number => {
    if (number % 2 === 0) {
      evenNumbers.push(number);
    } else {
      oddNumbers.push(number);
    }
  });

  console.log("Even: " + evenNumbers + "\nOdd: " + oddNumbers);
}

evenOrOdd([1, 4, 9, 21, 41, 92]);

这应该注销:4,92 1,9,21,41

只是一个数字:

function evenOrOdd(number) {
  if (number % 2 === 0) {
    return "even";
  }

  return "odd";
}

console.log(evenOrOdd(4));

这应该甚至输出到控制台

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.