Проверка четности или нечетности значения



я решил создать простой isEven и isOdd функция с очень простым алгоритмом:



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

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


это нормально, если n имеет определенные параметры, но не работает для многих сценариев. Поэтому я решил создать надежные функции, которые обеспечивают правильные результаты для как можно большего количества сценариев, так что проверяются только целые числа в пределах чисел javascript, все остальное возвращает false (включая + и - infinity). Обратите внимание, что ноль даже.



// 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.



Edit



тег обзора кода был добавлен, но я не после обзора кода. Я разместил код просто так, чтобы другие могли видеть, где я был до, а не как что-то пересмотреть. Ответы размещены до сих пор не догадался.



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


все, что не является числом возвращает неопределено, цифры возвращаются либо правда или ложные. Это может быть одна функция со строгим флагом, но я думаю, что строгое сравнение на самом деле не требуется.

598   15  

15 ответов:

использование модуля:

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

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

вы можете проверить, что любое значение в Javascript может быть приведено к числу с помощью:

Number.isFinite(parseFloat(n))

эта проверка предпочтительно должна быть сделана вне isEven и isOdd функции, поэтому вам не нужно дублировать обработку ошибок в обеих функциях.

Я предпочитаю использовать немного тест:

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

Это проверяет, является ли Первый БИТ на что означает нечетное число.

Как насчет следующих? Я только проверил это в IE, но он был вполне счастлив обрабатывать строки, представляющие числа любой длины, фактические числа, которые были целыми числами или плавающими, и обе функции возвращали false при передаче логического, неопределенного, нулевого, массива или объекта. (До вас, Хотите ли вы игнорировать начальные или конечные пробелы, когда строка передается - я предполагал, что они не игнорируется и заставляет обе функции возвращать false.)

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

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

Примечание: есть также отрицательные числа.

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

здесь

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

почему бы просто не сделать так:

    function oddOrEven(num){
        if(num % 2 == 0)
            return "even";
        return "odd";
    }
    oddOrEven(num);
var isEven = function(number) {
    // Your code goes here!
    if (number % 2 == 0){
       return(true);
    }
    else{
       return(false);    
    }
};

простая модификация / улучшение ответа Стива Майна!

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

Примечание: возвращает false, если неверный!

иначе:

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

isEven(69)

Otherway с помощью строк, потому что почему бы и нет

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

чтобы проверить, есть ли у вас нечетное или четное число, это также работает.

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

используя современный стиль 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)

может это? if (ourNumber % 2 !== 0)

простой способ проверить, является ли число даже на 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;
}

Это более простой!

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

  alert(aa[num % 2]);

Comments

    Ничего не найдено.