Проверка четности или нечетности значения
я решил создать простой 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;
}
все, что не является числом возвращает неопределено, цифры возвращаются либо правда или ложные. Это может быть одна функция со строгим флагом, но я думаю, что строгое сравнение на самом деле не требуется.
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; }
чтобы проверить, есть ли у вас нечетное или четное число, это также работает.
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)
простой способ проверить, является ли число даже на 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