web-dev-qa-db-ja.com

値が奇数か偶数かをテストする

私は非常に単純なアルゴリズムで単純なisEvenisOdd関数を作成することにしました。

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

数値ではないものはすべて未定義を返し、数値はtrueまたはfalseを返します。厳密なフラグを持つ1つの関数になることもありますが、厳密な比較は必ずしも必要ではないと思います。

144
RobG

係数を使う:

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

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

あなたはJavascriptのどんな値でも数値に強制変換できることを確認することができます。

Number.isFinite(parseFloat(n))

このチェックはisEvenisOdd関数の外側で行うのが望ましいので、両方の関数でエラー処理を重複させる必要はありません。

309
Steve Mayne

私は少しテストを使うのを好みます:

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

これは、最初のビットがオンであるかどうかをテストします。これは奇数を意味します。

67
Robert Brisita

以下はどうですか?これはIEでしかテストしていませんが、任意の長さの数値、整数または浮動小数点数の実際の数値を表す文字列を処理できてうれしいことでした。 (文字列が渡されたときに先行ブランクまたは後続ブランクを無視するかどうかはあなた次第です。それらはnot無視され、両方の関数がfalseを返すと仮定しました。)

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

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

注:負の数もあります

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

どこで

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

なぜこれをしないでください。

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

これには1行のコードが必要です。

これを行うためのより新しく代替的な方法は、JS関数には ES6 という新しい構文を使用し、if-elseステートメント呼び出しには 1行の構文 を使用することです。

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

alert(isEven(8));  //true
alert(isEven(9));  //false
alert(isEven(-8)); //true
1
Fellipe Sanches

Steve Mayneの答えを簡単に修正したものです。

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

注:無効な場合はfalseを返します。

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

たぶんこれ? if(ourNumber%2!== 0)

0
gavr1loo

あなたが奇数または偶数を持っているかどうかをテストするために、これも機能します。

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

最新の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)
0
gunn

それ以外の方法で文字列を使用する理由

function isEven(__num){
    return String(__num/2).indexOf('.') === -1;
}
0
Eric
if (testNum == 0);
else if (testNum % 2  == 0);
else if ((testNum % 2) != 0 );
0
Lindsay

別の方法:

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

isEven(69)
0
grizmin