Tester si une valeur est pair ou impair

, j'ai décidé de créer simple isEven et isOdd function avec un algorithme très simple:

function isEven(n) {
  n = Number(n);
  return n === 0 || !!(n && !(n%2));
}

function isOdd(n) {
  return isEven(Number(n) + 1);
}

C'est OK si n est avec certains paramètres, mais échoue pour de nombreux scénarios. J'ai donc entrepris de créer des fonctions robustes qui fournissent des résultats corrects pour autant de scénarios que possible, de sorte que seuls les entiers dans les limites des nombres javascript sont testés, tout le reste renvoie false (y compris + et - infinity). Notez que Zéro est pair.

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

Quelqu'un peut-il voir toutes les questions ci-dessus? Existe-t-il une version meilleure (c'est-à-dire plus précise, plus rapide ou plus concise sans être obscurcie)?

Il y a plusieurs articles relatifs à d'autres langues, mais je n'arrive pas à trouver une version définitive pour ECMAScript.

Modifier

Une balise de révision de code a été ajoutée, mais je ne suis pas après une révision de code. J'ai posté le code simplement pour que les autres puissent voir où j'en étais, pas comme quelque chose à revoir. Réponses postées jusqu'à présent semblent obtenir.

Modifier 2

Une fonction finale, basée sur la réponse de Steve:

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

Tout ce qui n'est pas un nombre renvoie undefined, numéros de retour soit true ou false. Cela pourrait être une fonction avec un drapeau strict, mais je pense que la comparaison stricte n'est pas vraiment nécessaire.

124
demandé sur RobG 2011-06-02 11:19:01

15 réponses

Utiliser Module:

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

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

Vous pouvez vérifier que toute valeur en Javascript peut être contrainte à un nombre avec:

Number.isFinite(parseFloat(n))

Cette vérification devrait de préférence être effectuée en dehors des fonctions isEven et isOdd, de sorte que vous n'avez pas à dupliquer la gestion des erreurs dans les deux fonctions.

274
répondu Steve Mayne 2015-11-13 11:58:09

Je préfère utiliser un test de bits:

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

Ceci teste si le premier bit est sur lequel signifie un nombre impair.

55
répondu Robert Brisita 2014-03-10 22:18:43

Que diriez-vous de ce qui suit? J'ai seulement testé cela dans IE, mais il était assez heureux de gérer des chaînes représentant des nombres de n'importe quelle longueur, des nombres réels qui étaient des entiers ou des flottants, et les deux fonctions renvoyaient false lorsqu'elles étaient passées un booléen, undefined, null, un tableau ou un objet. (À vous de décider si vous voulez ignorer les blancs de début ou de fin lorsqu'une chaîne est passée - j'ai supposé qu'ils sontpas ignorés et que les deux fonctions retournent false.)

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

function isOdd(n) {
   return /^-?\d*[13579]$/.test(n);
}
7
répondu nnnnnn 2011-06-02 08:07:49

Remarque: il y a aussi des nombres négatifs.

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

function isInteger(n)
{
   return n === parseInt(n, 10);
}
7
répondu Ivo Renkema 2018-10-04 19:14:06

Pourquoi ne pas simplement faire ceci:

    function oddOrEven(num){
        if(num % 2 == 0)
            return "even";
        return "odd";
    }
    oddOrEven(num);
3
répondu cipher 2016-12-05 16:21:10
var isEven = function(number) {
    // Your code goes here!
    if (number % 2 == 0){
       return(true);
    }
    else{
       return(false);    
    }
};
1
répondu Pandemum 2014-07-06 14:06:04

Une simple modification / amélioration de Steve Mayne réponse!

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

Remarque: renvoie false si invalide!

1
répondu Eduardo Lucio 2015-07-30 14:17:43

Manière différente:

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

isEven(69)
0
répondu grizmin 2015-01-17 15:17:00

Autrement en utilisant des chaînes parce que pourquoi pas

function isEven(__num){
    return String(__num/2).indexOf('.') === -1;
}
0
répondu Eric 2016-03-06 14:35:28
if (testNum == 0);
else if (testNum % 2  == 0);
else if ((testNum % 2) != 0 );
0
répondu Lindsay 2016-04-03 18:08:49

Pour tester si vous avez un nombre pair ou impair, cela fonctionne également.

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
répondu Siop 2017-10-28 01:09:22

Utiliser le style javascript moderne:

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
répondu gunn 2017-10-31 03:07:32

Peut-être ça? si (ourNumber % 2 !== 0)

0
répondu gavr1loo 2018-03-28 13:12:09

Moyen Simple de tester si un nombre utilise même JavaScript

function isEven(x) {
//return true if even
if (x % 2 === 0) {
    return true;
}
//return false otherwise
else {
    return false
}
}
// or much simpler
function isEven(x) {
return x % 2 === 0;
}
-1
répondu adedapoma 2018-06-30 18:45:55

Celui - ci est plus simple!

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

  alert(aa[num % 2]);
-2
répondu AndroidManifester 2015-12-10 04:00:32