JavaScriptで数値が奇数かどうかを判別する方法


245

JavaScriptの数値が偶数か奇数かを判断するコードを誰かに教えてもらえますか?



1
@DavidThomas私は部分的に同意しますが、2つの注意点があります。1。選択しなければならない場合は、初心者プログラマーが%演算子よりも知っていると思います&。2。&理論的には高速ですが、問題ではありません
小次郎2012

3
@kojiro:もっと(有効な)オプションを学習者に提示したい。加えて、以前はこの方法でビットごとの&を使用することを考えたことがなかったので、興味深いテイクです。とにかく、それだまされているので、私は既存の質問との合併のフラグを立てました。うまくいけば、ここでの答え(少なくともその特定の答え)は失われないでしょう。
デビッドはモニカを

1
@kojiro計算時間のほとんどが関数呼び出しに費やされているので、フィドルはまったく役に立たないと私は恐れています。しかし、数値が奇数か偶数かを判別するために関数呼び出しを使用する人は誰もいません...テストの3番目のリビジョンを作成しましたが、今は私の電話にいます...
MaxArt

回答:


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
これは、0または1(またはNaN、数値ではなく、1に強制できないものをフィードする場合)を返すことに注意してください。これは、ほとんどの状況で正常に機能します。しかし、あなたは本当かどうtruefalsereturn (num % 2) == 1;
TJクラウダー

3
ええ、NaNについての良いメモ。しかし、通常、あなたはjavascriptを真実か偽りにしたいのです、それが私が私がしたようにそれを書いた理由です。
Chii

9
明確にするために、剰余演算子(%)は除算の残りを与えます。SO 3%2は、したがって、3%2 1.返され、残りとして1を残し、3/2であろう
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
テストが正確かどうかはわかり
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; }は、の不必要に冗長なバージョンですanswer = (bool) condition;。機能をに下げればfunction isEven(value) { return (bool) (value%2 == 0); }、私たちは皆幸せになります。
awm

9
何か別の方法でプログラムするので、むちゃくちゃにする必要はありません。
TNC、

5
@awm- JavaScriptを知らないようです。を使用してブール値にキャストすることはできず(bool)(エラーが発生します)、いずれの場合も必要はありません。演算子がブール値を返すreturn value%2 == 0;ため、ジョブが実行され==ます。
nnnnnn 2012

2
うわー、本当に書いたの?はい、それは明らかに間違っています。のようなものでなければなりませんanswer = !!(condition)。もちろん、私が言おうとしてreturn value%2==0いたのは、条件に悩む必要がないということです。
awm

エレガントだと思います: value%2===0
carlodurso


13

偶数の多い配列を本当に大きくする必要がありますか

いいえ。係数(%)を使用します。それはあなたがあなたが割っている2つの数字の残りをあなたに与えます。

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

==真

Numberかどうかわからない場合は、次の分岐でテストしてください。

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

更新:

変数を使用しない場合:

(5).isOdd()

パフォーマンス:

手続き型パラダイムはOOPパラダイムよりも優れていることがわかります。ちなみに、このFIDDLEでプロファイリングを行い ました。ただし、OOPの方法はまだきれいです。

ここに画像の説明を入力してください


おかげで、このロジックについて、インタビュー対象者が誰かがこの種のロジックを尋ねたので答えられなかったので、私はそれを理解しました。isEven(x);と書くこともできます。など
Shoib Mohammed A '28 / 12/15

@ShoibMohammedA:比較が行われました!jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI

-1は、ネイティブプロトタイプ関数を拡張しません。(stackoverflow.com/questions/14034180/...
tfmontague

3

-1または0に達するまで2を再帰的に減算します(明らかに正の整数に対してのみ機能します)


負の数では、代わりに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で実行すると、完全に機能します。(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ステートメントは、数値が偶数のときに実行され、Elseは奇数のときに実行されます。

特定の数値が奇数かどうかを知りたいだけの場合:

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

ここでも、Xを数値または変数に置き換えます。


2

2で割ったときのすべての奇数は1として残り、0で割ったときのすべての偶数は残りとしてゼロを残します。したがって、このコードを使用できます

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

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

何らかの理由で、配列の長さを1だけ短くする必要がありました。それを行わないと、oddNumbers配列の最後の要素で「未定義」になります。


2
これは、条件が「<=」以下の配列の長さに設定されているためです。等号を削除しましたが、希望通りの結果でした。
Zakher Masri 2015

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

を使用%すると、これを行うのに役立ちます...

あなたはあなたのためにそれを行うためにいくつかの関数を作成することができます...私はあなたが数値を渡すかどうかもチェックするこのような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の1つのライナー。

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


2

多くの人が奇妙な意味を誤解しています

  • isOdd("str")偽でなければなりません。
    整数のみが奇数になることができます。
  • isOdd(1.223)isOdd(-1.223)偽でなければなりません。
    floatは整数ではありません。
  • 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/

ワンライナー

JavaScript 1ライナーソリューション。読みやすさを気にしない人のために。

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

あなたはまだソリューションを加速することができます。つまり、最後のステートメントでは!!(n%2)だけを返すことができます。これにより、オプションで符号付きの数値で機能します(つまり、n%2が0を返す場合はfalseですが、-1または1が返される場合はtrueを返します)。モジュラスの戻り値が0かどうかをチェックしているため、ソリューションは実際には奇数に対してfalseを返しますが、1をチェックする必要があり、負の数に対して1は失敗するため、戻り値は!!(n%2)の方が安全です。とにかく、{}(ブロックステートメント)は縮小の問題を引き起こさず、ディスカッションには含まれていません。
Hydroper 2017

@TheProHands-メモをありがとう。(1)問題は、Modulusバージョンにタイプミスがあったことです。の(n % 2) !== 0代わりにすべきだった(n % 2) === 0。(2)私のアドバイスは、(a)(jsperf.com/notnot-vs-strict-not!!(n % 2)よりもパフォーマンスが遅いため、(b)これはハックです-に誤った値を強制し、(c)それはあいまいです(高水準プログラミング言語は、パフォーマンスのためにPascalのように読むべきではありません-それはコンパイラの仕事です)。(3)はい、欠落しているブロックステートメントはいくつかの問題を引き起こします(私の回答で更新されています)。(n % 2) !== 00false{}
tfmontague 2017

読みやすさを重視しているため、ブロックステートメントは避けませんが、ブロックステートメントを検索しても問題が発生しないことを伝えようとしています。コードの保守のみです。つまり、ブロックステートメントの代わりに式ステートメントとマージされたシーケンス式を使用すると、コードが判読できなくなり、醜くなります(つまり:)。if (0) call1(), assign = 0, call2()ただし、単一のステートメントは悪くありません:if (0) return; if (0) ;; if (0); break; if (0) continue;、とにかく、私はブレークラインブロックステートメントの使用を続けます長いインライン条件。
Hydroper 2017

あなたのようなタイプ/ nullのチェックはisNaN(n)愚かです-必ずがカバーNaNケースを、しかしisOdd(null)isOdd(undefined)isOdd({x:1})すべての戻りfalse私は誤りであると考えます。もちろん、関数が特定のドメインで正しい動作をすることのみを指定している場合を除き、数値型の入力のみです。その場合は、isNaNチェックをドロップして、ユーザーに正しいタイプでそれを呼び出させるだけです。防御的なプログラミングはひどいです。次に、関数を簡略化しますisOdd = x => Math.floor(x) === x && x & 1 === 1–明示的な値trueまたはfalse値を返す必要はありません
ありがとう、

nullundefinedおよびオブジェクト{}は奇数の整数ではないため、関数は戻り値を返しますfalse-エラーと見なす理由がわかりません。このisNaNチェックはパフォーマンスのため(防御のためではなく)であり、他のチェックを実行せずに関数を早期に終了させます。
tfmontague

1

これを実装してブール値を返します。

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

署名されていない番号と署名された番号の両方で機能します。係数が戻る-1か、または1に変換され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
既存の26の回答を含む8年前の質問に回答を追加する場合、回答の対象となる質問の新しい側面、および時間の経過と新しいバージョンが回答に影響を与えるかどうかを説明すると非常に役立ちます。ほとんどの場合、コードのみの回答は、いくつかの説明を追加することで改善できます。この場合、使用例を示すいくつかの呼び出し例があります。
Jason Aller

1
タイトルは「JavaScriptで数値が奇数かどうかを判断する方法」であり、尋ねられたものについて投稿されたES6ソリューションはありませんでした。
ダリルメンドネス


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

これはコンソールにも出力されるはずです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.