Проверка того, является ли значение нечетным или даже
Я решил создать простую функцию 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 (включая + и - бесконечность). Обратите внимание, что ноль является четным.
// 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.
Ответы
Ответ 1
Использовать модуль:
function isEven(n) {
return n % 2 == 0;
}
function isOdd(n) {
return Math.abs(n % 2) == 1;
}
Вы можете проверить, что любое значение в Javascript можно принуждать к числу с помощью:
Number.isFinite(parseFloat(n))
Эта проверка предпочтительно должна выполняться вне функций isEven
и isOdd
, поэтому вам не нужно дублировать обработку ошибок в обеих функциях.
Ответ 2
Я предпочитаю использовать бит-тест:
if(i & 1)
{
// ODD
}
else
{
// EVEN
}
Это проверяет, является ли первый бит, на котором означает нечетное число.
Ответ 3
Как насчет следующего? Я тестировал это только в IE, но был очень рад обрабатывать строки, представляющие числа любой длины, действительные числа, которые были целыми числами или плавающими, а обе функции возвращали false при передаче логических, undefined, null, массива или объекта, (До вас, хотите ли вы игнорировать ведущие или конечные пробелы при передаче строки - я предположил, что они не игнорируются и заставляют обе функции возвращать false.)
function isEven(n) {
return /^-?\d*[02468]$/.test(n);
}
function isOdd(n) {
return /^-?\d*[13579]$/.test(n);
}
Ответ 4
Примечание: есть и отрицательные числа.
function isOddInteger(n)
{
return isInteger(n) && (n % 2 !== 0);
}
где
function isInteger(n)
{
return n === parseInt(n, 10);
}
Ответ 5
Почему бы просто не сделать это:
function oddOrEven(num){
if(num % 2 == 0)
return "even";
return "odd";
}
oddOrEven(num);
Ответ 6
Для завершения теста Роберта Брисита.
if ( ~i & 1 ) {
// Even
}
Ответ 7
var isEven = function(number) {
// Your code goes here!
if (number % 2 == 0){
return(true);
}
else{
return(false);
}
};
Ответ 8
Простая модификация/улучшение ответа Стива Майна!
function isEvenOrOdd(n){
if(n === parseFloat(n)){
return isNumber(n) && (n % 2 == 0);
}
return false;
}
Примечание. Возвращает false, если это неверно!
Ответ 9
Нам просто нужна одна строка кода для этого!
Вот более новый и альтернативный способ сделать это, используя новый синтаксис ES6 для функций JS и однострочный синтаксис для вызова оператора if-else
:
const isEven = num => ((num % 2) == 0) ? true : false;
alert(isEven(8)); //true
alert(isEven(9)); //false
alert(isEven(-8)); //true
Ответ 10
По-другому:
var isEven = function(number) {
// Your code goes here!
if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;};
};
isEven(69)
Ответ 11
В противном случае используйте строки, потому что почему не
function isEven(__num){
return String(__num/2).indexOf('.') === -1;
}
Ответ 12
if (testNum == 0);
else if (testNum % 2 == 0);
else if ((testNum % 2) != 0 );
Ответ 13
Чтобы проверить, есть ли у вас нечетное или четное число, это также работает.
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');
}
}
Ответ 14
Использование современного стиля 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)
Ответ 15
Может быть, это? if (ourNumber% 2! == 0)
Ответ 16
Простой способ проверить, использует ли число даже 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;
}
Ответ 17
Это проще!
var num = 3 //instead get your value here
var aa = ["Even", "Odd"];
alert(aa[num % 2]);
Ответ 18
function isEven(n) {return parseInt(n)%2===0?true:parseInt(n)===0?true:false}
когда 0/даже хотел но
isEven(0) //true
isEven(1) //false
isEven(2) //true
isEven(142856) //true
isEven(142856.142857)//true
isEven(142857.1457)//false
Ответ 19
if (i % 2) {
return odd numbers
}
if (i % 2 - 1) {
return even numbers
}