Як визначити, чи число непарне в JavaScript


245

Чи може хтось вказати мені на якийсь код, щоб визначити, чи є число в JavaScript парним чи непарним?



1
@DavidThomas Я частково погоджуюся, але у мене є два застереження: 1. Якби мені довелося вибирати, я б швидше програміст-початківець знав про %оператора, ніж &2. Хоча &теоретично швидше, це насправді не має значення .
kojiro

3
@kojiro: я вважаю за краще, щоб більшу кількість (дійсних) варіантів було запропоновано студенту; плюс я раніше ніколи не думав використовувати побито- та таким чином, тому це цікаво. У всякому разі, так як це простак, я помітив для злиття з уже існуючим питанням. Сподіваємось, відповіді тут (хоча б конкретна відповідь) не будуть втрачені.
Девід каже повернути Моніку

1
@kojiro Я боюся сказати, що ваша загадка досить марна, оскільки більшу частину обчислювального часу займає виклик функції. Але ніхто не використовуватиме виклик функції, щоб визначити, чи число непарне чи парне ... Я зробив третю ревізію вашого тесту, але зараз я в телефоні ...
MaxArt

Відповіді:


347

Використовуйте наведений нижче код:

function isOdd(num) { return num % 2;}
console.log("1 is " + isOdd(1));
console.log("2 is " + isOdd(2));
console.log("3 is " + isOdd(3));
console.log("4 is " + isOdd(4));

1 являє собою непарне число, тоді як 0 являє собою парне число.


97
Зверніть увагу, що це повернеться 0або 1(або, NaNякщо ви будете годувати його чимось, що не є числом, і його не можна примусити до одного), що буде добре працювати в більшості ситуацій. Але якщо ви хочете справжнього trueабо false:return (num % 2) == 1;
TJ Crowder

3
так, хороша примітка про NaN. Але, як правило, ви хочете, щоб javascript був truthy або falsey, ось чому я написав його так, як і я.
Chii

9
Просто для уточнення, оператор модуля (%) дає решту поділу. Так 3% 2 буде 3/2, 1 залишиться як залишок, тому 3% 2 повернеться 1.
Абу

6
Крім того, що сказав TJ, це поверне дріб, якщо numце не ціле число. Що все-таки спрацює, якщо порівнювати isOdd(1.5)==true(оскільки дробове значення не дорівнює true), але було б краще, якби функція повернулася trueабо falseяк мається на увазі назва "isOdd".
nnnnnn

6
Ви також return !!(num % 2)можете отримати буле
Duncan

115

Використовуйте бітовий ANDоператор.

function oddOrEven(x) {
  return ( x & 1 ) ? "odd" : "even";
}

function checkNumber(argNumber) {
  document.getElementById("result").innerHTML = "Number " + argNumber + " is " + oddOrEven(argNumber);
}
 
checkNumber(17);
<div id="result" style="font-size:150%;text-shadow: 1px 1px 2px #CE5937;" ></div>

Якщо ви не хочете повертати значення рядка, а швидше булеве, скористайтеся цим:

var isOdd = function(x) { return x & 1; };
var isEven  = function(x) { return !( x & 1 ); };

5
+1, ви відповідаєте, безумовно, б'є мій, не кажучи вже про те, що у вас єдина відповідь, яка не використовується X % Y!
s0d4pop

4
Я не впевнений, чи мій тест точний, але побітна І здається, що в 40 разів повільніше, ніж оператор модуля для фіксованого числа, і в 2 рази повільніше для випадкового числа: jsperf.com/odd-or-even
Blender

8
Зауважте, що це поверне "непарне" або "парне" для чисел, які не є або (наприклад, 3.14).
nnnnnn

2
Або: function isEven(n){return !(n & 1);}.
RobG

7
@Gnuey Кожне число складається з серії біт. Усі непарні числа мають найменш значимий (правий) біт, встановлений на 1, усі парні числа 0. x & 1Перевіряє, чи встановлено останній біт у номері (тому що 1 - це число зі всіма бітами, встановленими на 1, за винятком найменш значущого біта ): Якщо це число непарне, інакше навіть.
0x499602D2

31

Ви можете зробити щось подібне:

function isEven(value){
    if (value%2 == 0)
        return true;
    else
        return false;
}

9
Здається, ви не знаєте, що таке булева мова. if (condition) { answer=true; } else { answer=false; }це просто зайве багатослівна версія answer = (bool) condition;. Зменшіть свою функцію до, function isEven(value) { return (bool) (value%2 == 0); }і всі ми будемо раді.
awm

9
Не потрібно заїдатись, бо я програмую щось інакше.
ТНК

5
@awm - Схоже, ви не знаєте JavaScript. Ви не можете привласнити boolean з (bool)(це return value%2 == 0;призведе до помилки), і в будь-якому випадку вам не потрібно: буде виконувати роботу, оскільки ==оператор повертає булевий.
nnnnnn

2
Вау, я справді це писав? Так, це очевидно неправильно; повинно бути щось подібне answer = !!(condition). Суть, яку я намагався зробити, звичайно, полягає в тому, що можна просто return value%2==0і не потрібно турбуватися з умовними.
awm

Я вважаю це елегантним: value%2===0
carlodurso


13

Чи потрібно робити масив дійсно великим, який має багато парних чисел

Ні. Використовуйте модуль (%). Це дає вам залишок двох чисел, які ви ділите.

Ex. 2 % 2 = 0 because 2/2 = 1 with 0 remainder.

Ex2. 3 % 2 = 1 because 3/2 = 1 with 1 remainder.

Ex3. -7 % 2 = -1 because -7/2 = -3 with -1 remainder.

Це означає, що якщо ви модифікуєте будь-яке число x на 2, ви отримуєте або 0, або 1, або -1. 0 означатиме, що це рівномірно. Все інше означало б, що це дивно.


8

Це можна вирішити за допомогою невеликого фрагмента коду:

function isEven(value) {
    if (value%2 == 0)
    return true;
else
    return false;
}

Сподіваюся, це допомагає :)


6

Як і в багатьох мовах, у Javascript є оператор модуля% , який знаходить решту поділу. Якщо після ділення на 2 немає залишку, число є парним:

// this expression is true if "number" is even, false otherwise
(number % 2 == 0)

Це дуже поширена ідіома для тестування на парні цілі числа.


3
Однак модуль може бути складним / невизначеним для негативних значень .. обов'язково зверніться до відповідної специфікації мови.


5

Проста функція, яку ви можете пройти навколо. Використовується оператор модуля %:

var is_even = function(x) {
    return !(x % 2); 
}

is_even(3)
false
is_even(6)
true

1
Якщо ваші результати в потрійному операторі або "правдиві", або "помилкові", вам дійсно не потрібен потрійний оператор. Ось, ви могли / повинні просто зробити:return !(x % 2);
dom_watson

4

Використовувати мої розширення:

Number.prototype.isEven=function(){
     return this % 2===0;
};

Number.prototype.isOdd=function(){
     return !this.isEven();
}

тоді

var a=5; 
 a.isEven();

== Неправдиво

 a.isOdd();

== Правда

якщо ви не впевнені, чи це число, протестуйте його за допомогою наступного розгалуження:

if(a.isOdd){
    a.isOdd();
}

ОНОВЛЕННЯ:

якщо ви не використовуєте змінну:

(5).isOdd()

Продуктивність:

Виявляється, процедурна парадигма краща за парадигму ООП. До речі, я виконував профілювання в цьому ПІДТВОРЕННІ . Однак спосіб OOP як і раніше найкрасивіший.

введіть тут опис зображення


Дякую чувак, за цю логіку, в опитуваного хтось запитував таку логіку, не міг відповісти, тепер я отримав її, дякую .. але чи є якась користь у виконанні, дотримуючись цього методу? ми могли б написати isEven (x); і т. д.
Шоїб Мухаммед A

@ShoibMohammedA: Порівняння зроблено! jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI

-1 не розширювати функції власного прототипу. ( Stackoverflow.com/questions/14034180 / ... )
tfmontague

3

Віднімайте 2 рекурсивно, поки не досягнете -1 або 0 (працює лише для натуральних чисел) :)


З від'ємними цифрами ви замість цього збільшуєте 2
Hydroper

І проходить пекло часу, коли n = 2 ^ 52, і нескінченна кількість для n> 2 ^ 53
rioV8

3

Ви можете використовувати для оператора і умовного, щоб визначити, чи число чи ряд чисел непарні:

for (var i=1; i<=5; i++) 
if (i%2 !== 0) {
    console.log(i)
}

Це надрукує кожне непарне число від 1 до 5.


3

Щойно виконаний цей в Adobe Dreamweaver .. він працює чудово. я використовував if (isNaN (mynmb))

щоб перевірити, чи задане значення є числом чи ні, і я також використовував Math.abs (mynmb% 2) для перетворення негативного числа у позитивне та обчислення

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

</head>
<body bgcolor = "#FFFFCC">
    <h3 align ="center"> ODD OR EVEN </h3><table cellspacing = "2" cellpadding = "5" bgcolor="palegreen">
        <form name = formtwo>
            <td align = "center">
                <center><BR />Enter a number: 
                    <input type=text id="enter" name=enter maxlength="10" />
                    <input type=button name = b3 value = "Click Here" onClick = compute() />
                      <b>is<b> 
                <input type=text id="outtxt" name=output size="5" value="" disabled /> </b></b></center><b><b>
                <BR /><BR />
            </b></b></td></form>
        </table>

    <script type='text/javascript'>

        function compute()
        {
          var enter = document.getElementById("enter");
          var outtxt = document.getElementById("outtxt");

          var mynmb = enter.value;
          if (isNaN(mynmb)) 
          { 
            outtxt.value = "error !!!"; 
            alert( 'please enter a valid number');
            enter.focus();
            return;
          }
          else 
          { 
             if ( mynmb%2 == 0 ) { outtxt.value = "Even"; }  
             if ( Math.abs(mynmb%2) == 1 ) { outtxt.value = "Odd"; }
          }
        }

    </script>
</body>
</html>

3
   <script>
        function even_odd(){
            var num =   document.getElementById('number').value;

            if ( num % 2){
                document.getElementById('result').innerHTML = "Entered Number is Odd";
            }
            else{
                document.getElementById('result').innerHTML = "Entered Number is Even";
            }
        }
    </script>
</head>
<body>
    <center>
        <div id="error"></div>
        <center>
            <h2> Find Given Number is Even or Odd </h2>
            <p>Enter a value</p>
            <input type="text" id="number" />
            <button onclick="even_odd();">Check</button><br />
            <div id="result"><b></b></div>
        </center>
    </center>
</body>

2
if (X % 2 === 0){
} else {
}

Замініть X своїм номером (може походить зі змінної). Оператор If запускається, коли число парне, Else - коли непарне.

Якщо ви просто хочете дізнатися, чи якесь задане число є непарним:

if (X % 2 !== 0){
}

Знову замініть X числом чи змінною.


2

Кожне непарне число, яке ділиться на два листки, залишається на 1, а кожне парне число при діленні на нуль залишає нуль як залишок. Отже, ми можемо використовувати цей код

  function checker(number)  {
   return number%2==0?even:odd;
   }


2

Це я і зробив

//Array of numbers
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,32,23,643,67,5876,6345,34,3453];
//Array of even numbers
var evenNumbers = [];
//Array of odd numbers
var oddNumbers = [];

function classifyNumbers(arr){
  //go through the numbers one by one
  for(var i=0; i<=arr.length-1; i++){
     if (arr[i] % 2 == 0 ){
        //Push the number to the evenNumbers array
        evenNumbers.push(arr[i]);
     } else {
        //Push the number to the oddNumbers array
        oddNumbers.push(arr[i]);
     }
  }
}

classifyNumbers(numbers);

console.log('Even numbers: ' + evenNumbers);
console.log('Odd numbers: ' + oddNumbers);

Я чомусь повинен був переконатися, що довжина масиву менша на одиницю. Коли я цього не роблю, я отримую "невизначений" в останньому елементі масиву oddNumbers.


2
Це тому, що умова встановлена ​​на меншу або рівну "<=" довжині масиву. Я зняв знак рівності, і результат був бажаний.
Захер Масрі

2

Коли вам потрібно перевірити, чи якась змінна непарна, спершу слід перевірити, чи вона є цілою . Також зауважте, що при обчисленні залишку за від’ємним числом результат буде від’ємним ( -3 % 2 === -1).

function isOdd(value) {
  return typeof value === "number" && // value should be a number
    isFinite(value) &&                // value should be finite
    Math.floor(value) === value &&    // value should be integer
    value % 2 !== 0;                  // value should not be even
}

Якщо Number.isInteger доступний, ви можете також спростити цей код для:

function isOdd(value) {
  return Number.isInteger(value)      // value should be integer
    value % 2 !== 0;                  // value should not be even
}

Примітка. Тут ми перевіряємо value % 2 !== 0замість value % 2 === 1цього -3 % 2 === -1. Якщо ви не хочете-1 пройти цей тест, можливо, вам знадобиться змінити цей рядок.

Ось кілька тестових випадків:

isOdd();         // false
isOdd("string"); // false
isOdd(Infinity); // false
isOdd(NaN);      // false
isOdd(0);        // false
isOdd(1.1);      // false
isOdd("1");      // false
isOdd(1);        // true
isOdd(-1);       // true

2

Використання % допоможе вам це зробити ...

Ви можете створити пару функцій, щоб зробити це за вас ... Я віддаю перевагу роздільним функціям, які не приєднані до номера в Javascript, як ця, яка також перевіряє, чи передаєте ви номер чи ні:

непарна функція:

var isOdd = function(num) {
  return 'number'!==typeof num ? 'NaN' : !!(num % 2);
};

рівна функція:

var isEven = function(num) {
  return isOdd(num)==='NaN' ? isOdd(num) : !isOdd(num);
};

і називайте це так:

isOdd(5); // true
isOdd(6); // false
isOdd(12); // false
isOdd(18); // false
isEven(18); // true
isEven('18'); // 'NaN'
isEven('17'); // 'NaN'
isOdd(null); // 'NaN'
isEven('100'); // true

2

Один вкладиш в ES6 тільки тому, що він чистий.

const isEven = (num) => num % 2 == 0;


2

Багато людей неправильно розуміють значення непарних

  • isOdd("str")має бути помилковим.
    Лише ціле число може бути непарним.
  • isOdd(1.223)і isOdd(-1.223)має бути помилковим.
    Поплавок - не ціле число.
  • isOdd(0)має бути помилковим.
    Нуль - це ціле число ( https://en.wikipedia.org/wiki/Pality_of_zero ).
  • isOdd(-1)має бути правдою.
    Це непарне ціле число.

Рішення

function isOdd(n) {

  // Must be a number
  if (isNaN(n)) {
    return false;
  }

  // Number must not be a float
  if ((n % 1) !== 0) {
    return false;
  }

  // Integer must not be equal to zero
  if (n === 0) {
    return false;
  }

  // Integer must be odd
  if ((n % 2) !== 0) {
    return true;
  }

  return false;
}

JS Fiddle (за потреби): https://jsfiddle.net/9dzdv593/8/

1-вкладиш

Рішення Javascript для 1-лайнера. Для тих, хто не переймається читабельністю.

const isOdd = n => !(isNaN(n) && ((n % 1) !== 0) && (n === 0)) && ((n % 2) !== 0) ? true : false;

Ви можете прискорити рішення ще. тобто у підсумкових висловлюваннях ви можете просто повернути !! (n% 2), це необов'язково змусить його працювати з підписаними номерами (тобто, коли n% 2 повертає 0, це неправда, але коли повернуться -1 або 1, це буде повернути правду). Ваше рішення фактично повертає помилкові для непарних чисел, оскільки перевіряє, чи повертається модуль 0, але слід перевірити 1, і 1 не вдасться до від'ємних чисел, таким чином повернення !! (n% 2) є безпечнішим. І в будь-якому разі, {} (блок заява) не викликає проблем із мінімізацією і не присутній в обговоренні.
Hydroper

@TheProHands - Дякую за замітки. (1) Проблема полягала в тому, що версія Modulus мала друк; це мало бути (n % 2) !== 0замість (n % 2) === 0. (2) Моя порада - уникати !!(n % 2), оскільки (a) вона має повільніші показники, ніж (n % 2) !== 0( jsperf.com/notnot-vs-strict-not ); (b) це злом - він примушує значення фальси 0до falseі (c) це незрозуміло (мови програмування високого рівня не повинні читати як Pascal заради продуктивності - це завдання компілятора). (3) Так, відсутні {}твердження блоку призводять до кількох питань (оновлених у моїй відповіді).
tfmontague

Я ніколи не уникаю операторів блоку, тому що я дбаю про читабельність, але намагаюся сказати, що пошук блокових операторів не призводить до проблем, лише до коду maintainace. Тобто, використовуючи вирази послідовності злиті з виразом заяви замість оператора блоку може зробити код нечитабельним , і некрасиво, тобто: if (0) call1(), assign = 0, call2(), але один оператор не погано: if (0) return; if (0) ;; if (0); break; if (0) continue;і в будь-якому випадку я вважаю за краще продовжувати використовувати оператори блоку розрив рядка , коли я довгострокові умови.
Гідропер

перевіряє тип / нуль , як ваш isNaN(n)дурні - що ви покрили NaNсправу, але isOdd(null), isOdd(undefined), isOdd({x:1})все повертаютьсяfalse , які я вважаю помилкою; якщо, звичайно, ви не вказуєте лише на те, що ваша функція має правильну поведінку щодо даного домену: лише введення номерів типу. У такому випадку просто відкиньте isNaNчек і змусьте користувача викликати його правильного типу. Оборонне програмування - жахливо. Тоді ваша функція спрощується до isOdd = x => Math.floor(x) === x && x & 1 === 1- повернення явного trueабо falseзначення не потрібно
Дякую

null, undefinedа об'єкти {}не є непарними цілими числами, і тому функція повертається false- не впевнений, чому ви вважаєте цю помилку. isNaNПеревірка для виконання (не для захисту), вона дозволяє функцію виходу передчасно , без виконання інших перевірок.
tfmontague

1

Я б реалізував це, щоб повернути булеве:

function isOdd (n) {
    return !!(n % 2);
    // or ((n % 2) !== 0).
}

Він працюватиме як підписані, так і підписані номери. Коли модуль повернеться -1або 1він буде переведений на true.

Немодульне рішення:

var is_finite = isFinite;
var is_nan = isNaN;

function isOdd (discriminant) {
    if (is_nan(discriminant) && !is_finite(discriminant)) {
        return false;
    }

    // Unsigned numbers
    if (discriminant >= 0) {
        while (discriminant >= 1) discriminant -= 2;

    // Signed numbers
    } else {
        if (discriminant === -1) return true;
        while (discriminant <= -1) discriminant += 2;
    }

    return !!discriminant;
}

1

Більш функціональний підхід у сучасному javascript:

const NUMBERS = "nul one two three four five six seven ocho nueve".split(" ")

const negate = f=> (...args)=> !f(...args)
const isOdd  = n=> NUMBERS[n % 10].indexOf("e")!=-1
const isEven = negate(isOdd)

1

в ES6:

const isOdd = num => num % 2 == 1;


3
Додаючи відповідь на восьмирічне запитання з 26 існуючими відповідями, справді корисно пояснити, який новий аспект питання стосується вашої відповіді, і якщо проходження часу та нові версії впливають на відповідь. Відповідь лише на код можна майже завжди покращити, додавши якесь пояснення, і в цьому випадку деякі приклади дзвінків, що показують використання.
Джейсон Аллер

1
заголовок: "Як визначити, чи число непарне в JavaScript", і не було розміщено рішення ES6 для того, що запитується.
Дарріл Мендонес


0

це працює для масивів:

function evenOrOdd(numbers) {
  const evenNumbers = [];
  const oddNumbers = [];
  numbers.forEach(number => {
    if (number % 2 === 0) {
      evenNumbers.push(number);
    } else {
      oddNumbers.push(number);
    }
  });

  console.log("Even: " + evenNumbers + "\nOdd: " + oddNumbers);
}

evenOrOdd([1, 4, 9, 21, 41, 92]);

це має вийти: 4,92 1,9,21,41

лише для кількості:

function evenOrOdd(number) {
  if (number % 2 === 0) {
    return "even";
  }

  return "odd";
}

console.log(evenOrOdd(4));

це має виводитись навіть на консоль

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.