【问题标题】:How to determine if a number is odd in JavaScript如何在 JavaScript 中判断一个数是否为奇数
【发布时间】:2011-02-16 12:17:58
【问题描述】:

谁能告诉我一些代码来确定 JavaScript 中的数字是偶数还是奇数?

【问题讨论】:

  • @DavidThomas 我部分同意,但我有两个警告:1. 如果必须选择,我宁愿初学者程序员知道% 运算符而不是&,以及 2。虽然& 理论上更快,但it really doesn't matter
  • @kojiro:我宁愿向学习者提供更多(有效)选项;另外,我以前从未想过以这种方式使用按位-&,所以这是一个有趣的选择。无论如何,因为它一个骗子,我已经标记为与预先存在的问题合并。希望这里的答案(至少是那个特定的答案)不会丢失。
  • @kojiro 恐怕你的小提琴没用,因为大部分计算时间都花在了函数调用上。但是没有人会使用函数调用来确定一个数字是奇数还是偶数...我对您的测试进行了第三次修订,但我现在正在使用手机...
  • 我想知道 Samuel Liew 所说的“太宽泛”是什么意思。确定一个数字是偶数还是奇数是否“太宽泛”?

标签: javascript


【解决方案1】:

使用下面的代码:

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代表偶数。

【讨论】:

  • 请注意,这将返回01(或NaN,如果您输入的不是数字且不能强制为一个),这将正常工作对于大多数情况。但如果你想要一个真正的truefalsereturn (num % 2) == 1;
  • 是的,关于 NaN 的注释很好。但通常情况下,您希望 javascript 是真还是假,这就是为什么我按照我的方式编写它的原因。
  • 为了澄清,模运算符 (%) 给出了除法的余数。所以 3%2 将是 3/2,剩下 1 作为余数,因此 3%2 将返回 1。
  • 进一步了解 T.J.说,如果num 不是整数,这将返回一个分数。如果您比较isOdd(1.5)==true(因为小数值不等于true),它仍然可以工作,但如果函数返回truefalse 会更好,正如名称“isOdd”所暗示的那样。
  • 你也可以return !!(num % 2) 得到一个布尔值
【解决方案2】:

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

【讨论】:

  • +1,你的答案肯定比我的好,更不用说你只有使用X % Y的答案!
  • 我不确定我的测试是否准确,但是对于固定数字,按位 AND 似乎比模运算符慢 40 倍,对于随机数慢 2 倍:jsperf.com/odd-or-even
  • 请注意,这将返回“奇数”或“偶数”而不是两者的数字(例如,3.14)。
  • 或:function isEven(n){return !(n & 1);}
  • @Gnuey 每个数字都由一系列位组成。所有奇数的最低有效位(最右边)设置为 1,所有偶数都设置为 0。x & 1 检查数字中的最后一位是否设置(因为 1 是一个所有位都设置为 1 的数字,除了最低有效位):如果,则为奇数,否则为偶数。
【解决方案3】:

你可以这样做:

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

【讨论】:

  • 您似乎不知道布尔值是什么。 if (condition) { answer=true; } else { answer=false; } 只是 answer = (bool) condition; 的冗长版本。将您的功能减少到function isEven(value) { return (bool) (value%2 == 0); },我们都会很高兴。
  • 不必刻薄,因为我的编程方式不同。
  • @awm - 好像 不懂 JavaScript。您不能使用 (bool) 转换为布尔值(这会产生错误),并且在任何情况下您都不需要:return value%2 == 0; 将完成这项工作,因为 == 运算符返回一个布尔值。
  • 哇,真的是我写的吗?是的,这显然是错误的;应该类似于answer = !!(condition)。当然,我要说明的一点是,您可以只使用return value%2==0,而无需为条件而烦恼。
  • 我觉得它很优雅:value%2===0
【解决方案4】:
function isEven(x) { return (x%2)==0; }
function isOdd(x) { return !isEven(x); }

【讨论】:

    【解决方案5】:

    我是否必须制作一个包含很多偶数的非常大的数组

    没有。使用模数 (%)。它为您提供要除的两个数字的余数。

    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 表示它是偶数。其他任何事情都意味着它很奇怪。

    【讨论】:

      【解决方案6】:

      这可以用一小段代码来解决:

      function isEven(value) {
          return !(value % 2)
      }
      

      希望这会有所帮助:)

      【讨论】:

        【解决方案7】:

        在 ES6 中:

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

        【讨论】:

        • 当为一个有 26 个现有答案的 8 年老问题添加答案时,解释您的答案所针对的问题的哪些新方面以及时间和新版本是否会影响答案确实很有用.仅代码的答案几乎总是可以通过添加一些解释来改进,在这种情况下,一些示例调用显示了用法。
        • 标题是“如何确定 JavaScript 中的数字是否为奇数”,并且没有针对所要求的内容发布 ES6 解决方案。
        【解决方案8】:

        按位,codegolfing:

        var isEven=n=>(n&1)?"odd":"even";
        

        【讨论】:

        • & 按位仅适用于最大 2^32 的数字。 % 适用于最多 2^53 的数字。
        • 是的,@Rewind 它只对一些代码高尔夫球挑战有用,不适用于编写生产代码
        【解决方案9】:

        像许多语言一样,Javascript 有一个modulus operator %,它可以找到除法的余数。如果除以 2 没有余数,则为偶数:

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

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

        【讨论】:

        • 但是,对于负值,模数可能很棘手/未定义。请务必查阅相应的语言规范。
        【解决方案10】:

        使用我的扩展:

        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()
        

        性能:

        事实证明,Procedural 范式优于 OOP 范式。 顺便说一句,我表演了profiling in this FIDDLE。但是,OOP 方式仍然是最漂亮的。

        【讨论】:

        【解决方案11】:

        一个可以传递的简单函数。使用模运算符%:

        var is_even = function(x) {
            return !(x % 2); 
        }
        
        is_even(3)
        false
        is_even(6)
        true
        

        【讨论】:

        • 如果你在三元运算符中的结果是“真”或“假”,你真的不需要三元运算符。在这里,您可以/应该这样做:return !(x % 2);
        【解决方案12】:
        if (X % 2 === 0){
        } else {
        }
        

        将 X 替换为您的号码(可以来自变量)。 If语句在偶数时运行,Else在奇数时运行。

        如果你只是想知道任何给定的数字是否是奇数:

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

        再次,将 X 替换为数字或变量。

        【讨论】:

          【解决方案13】:
             <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>
          

          【讨论】:

            【解决方案14】:

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

            【讨论】:

            • 负数改为增加 2
            • 当 n=2^52 时,它需要很长时间,而 n>2^53 则需要无限时间
            【解决方案15】:

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

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

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

            【讨论】:

              【解决方案16】:

              刚刚在 Adob​​e 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>
              

              【讨论】:

                【解决方案17】:

                当您需要测试某个变量是否为奇数时,您应该首先测试是否为整数。另外,请注意,当您计算负数的余数时,结果将为负数 (-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
                

                【讨论】:

                  【解决方案18】:

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

                  你可以创建几个函数来为你做这件事......我更喜欢像这样在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
                  

                  【讨论】:

                    【解决方案19】:

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

                    【讨论】:

                      【解决方案20】:

                      ES6 中的一个衬里只是因为它很干净。

                      const isEven = (num) =&gt; num % 2 == 0;

                      【讨论】:

                        【解决方案21】:

                        很多人对奇数的含义有误解

                        • 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 Fiddle(如果需要):https://jsfiddle.net/9dzdv593/8/

                        1-班轮

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

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

                        【讨论】:

                        • 您还可以加速解决方案。即,在最后的语句中,您可以只返回 !!(n % 2) ,这可以选择使用带符号的数字(即,当 n % 2 返回 0 时,它是假的,但是当 -1 或 1 返回时,这将返回真)。您的解决方案实际上是为奇数返回 false,因为它正在检查模返回是否为 0,但应该检查 1,而 1 对于负数会失败,因此 return !!(n % 2) 更安全。无论如何,{}(块语句)不会导致缩小问题,也不会出现在讨论中。
                        • @TheProHands - 感谢您的笔记。 (1) 问题是模数版本有错字;它应该是 (n % 2) !== 0 而不是 (n % 2) === 0。 (2) 我的建议是避免使用 !!(n % 2),因为 (a) 它的性能比 (n % 2) !== 0 (jsperf.com/notnot-vs-strict-not) 慢,(b) 这是一个 hack——它将虚假值 0 强制转换为 false, (c) 它晦涩难懂(为了性能,高级编程语言不应该像 Pascal 那样读起来——那是编译器的工作)。 (3) 是的,缺少 {} 块语句确实会导致几个问题(如我的回答中所更新)。
                        • 我从不避免使用块语句,因为我关心可读性,但我试图告诉你,寻找块语句不会导致问题,只会在代码维护方面。即,使用与表达式语句合并的序列表达式而不是块语句可能会使代码不可读和丑陋,即:if (0) call1(), assign = 0, call2(),但单个语句也不错:if (0) return; if (0) ;; if (0); break; if (0) continue;,无论如何我更喜欢继续使用断行当我有长内联条件时阻止语句。
                        • type/null 检查像你的isNaN(n) 是愚蠢的 - 确保你覆盖了NaN 的情况,但是isOdd(null)isOdd(undefined)isOdd({x:1}) 都返回false 我认为是一个错误;当然,除非您只是指定您的函数在给定域上具有正确的行为:只有数字类型的输入。在这种情况下,只需删除isNaN 检查并强制用户使用正确的类型调用它。防御性编程很糟糕。然后你的函数被简化为isOdd = x =&gt; Math.floor(x) === x &amp;&amp; x &amp; 1 === 1——返回显式truefalse值是不必要的
                        • nullundefined 和对象{} 不是奇数,因此该函数返回false - 不知道您为什么认为这是一个错误。 isNaN 检查是为了性能(不是为了防御),它让函数提前退出而不执行其他检查。
                        【解决方案22】:

                        每个奇数除以二时余数为 1,每个偶数除以零时余数为零。因此我们可以使用这段代码

                          function checker(number)  {
                           return number%2==0?even:odd;
                           }
                        

                        【讨论】:

                          【解决方案23】:

                          这个怎么样...

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

                          【讨论】:

                            【解决方案24】:

                            这就是我所做的

                            //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 数组的最后一个元素中得到“未定义”。

                            【讨论】:

                            • 这是因为条件设置为小于或等于数组长度的“
                            【解决方案25】:

                            我会实现它以返回一个布尔值:

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

                            【讨论】:

                              【解决方案26】:

                              通过使用三元运算符,我们可以找到奇偶数:

                              var num = 2;
                              result = (num % 2 == 0) ? 'even' : 'odd'
                              console.log(result);

                              【讨论】:

                                【解决方案27】:

                                另一个使用 filter() 方法的例子:

                                let even = arr.filter(val => {
                                  return val % 2 === 0;
                                });
                                // even = [2,4,6]
                                

                                【讨论】:

                                  【解决方案28】:

                                  这适用于数组:

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

                                  这甚至应该输出到控制台

                                  【讨论】:

                                    【解决方案29】:

                                    判断数字是否为奇数的方法

                                    let numbers = [11, 20, 2, 5, 17, 10];
                                    
                                    let n = numbers.filter((ele) => ele % 2 != 0);
                                    
                                    console.log(n);

                                    【讨论】:

                                      【解决方案30】:

                                      如果是奇数则返回真

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

                                      如果是偶数则返回真

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

                                      我使用 Math.abs() 以防得到负数

                                      【讨论】:

                                        猜你喜欢
                                        • 2017-03-05
                                        • 2011-08-17
                                        • 2015-02-08
                                        • 2011-05-24
                                        • 1970-01-01
                                        • 2019-05-02
                                        • 2019-02-11
                                        相关资源
                                        最近更新 更多