Cara menentukan apakah suatu angka ganjil dalam JavaScript

245

Adakah yang bisa mengarahkan saya ke beberapa kode untuk menentukan apakah angka dalam JavaScript genap atau ganjil?

Jannie Theunissen
sumber
1
@ Davidvidomas Saya sebagian setuju, tapi saya punya dua peringatan: 1. Jika saya harus memilih, saya lebih suka programmer pemula tahu tentang %operator daripada &, dan 2. Meskipun &secara teoritis lebih cepat, itu benar-benar tidak masalah .
kojiro
3
@ Kojiro: Saya lebih suka lebih banyak opsi (valid) disajikan kepada pelajar; ditambah saya tidak pernah berpikir untuk menggunakan bitwise- & dengan cara ini sebelumnya, jadi ini cara yang menarik. Lagi pula, karena itu adalah penipuan, saya telah ditandai untuk merger dengan pertanyaan yang sudah ada sebelumnya. Semoga jawaban di sini (setidaknya jawaban tertentu itu), tidak akan hilang.
David mengatakan mengembalikan Monica
1
@ Kojiro Saya takut untuk mengatakan bahwa biola Anda cukup berguna, karena sebagian besar waktu komputasi diambil oleh pemanggilan fungsi. Tapi tak seorang pun akan menggunakan pemanggilan fungsi untuk menentukan apakah suatu angka ganjil atau genap ... Saya membuat revisi ketiga dari tes Anda, tetapi saya menggunakan ponsel saya sekarang ...
MaxArt
1
kemungkinan rangkap dari Pengujian apakah nilainya ganjil atau genap
bummi

Jawaban:

347

Gunakan kode di bawah ini:

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 menunjukkan angka ganjil, sedangkan 0 mewakili angka genap.

Chii
sumber
97
Perhatikan bahwa ini akan kembali 0atau 1(atau NaNjika Anda memberinya sesuatu yang bukan angka dan tidak dapat dipaksa menjadi satu), yang akan berfungsi dengan baik untuk sebagian besar situasi. Tetapi jika Anda menginginkan yang asli trueatau false:return (num % 2) == 1;
TJ Crowder
3
ya catatan bagus tentang NaN. Tapi biasanya, Anda ingin javascript jujur ​​atau salah, itulah sebabnya saya menulisnya seperti yang saya lakukan.
Chii
9
Hanya untuk memperjelas, operator modulo (%) memberikan sisa divisi. Jadi 3% 2 akan menjadi 3/2, meninggalkan 1 sebagai sisa, oleh karena itu 3% 2 akan kembali 1.
Abuh
6
Lebih jauh dari apa yang dikatakan TJ, ini akan mengembalikan sebagian kecil jika numbukan bilangan bulat. Yang masih akan bekerja jika Anda membandingkan isOdd(1.5)==true(karena nilai fraksional tidak sama dengan true), tetapi akan lebih baik jika fungsi dikembalikan trueatau falseseperti yang tersirat dengan nama "isOdd".
nnnnnn
6
Anda juga dapat melakukannya return !!(num % 2)untuk mendapatkan boolean
Duncan
115

Gunakan ANDoperator bitwise .

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>

Jika Anda tidak menginginkan nilai pengembalian string, melainkan nilai boolean, gunakan ini:

var isOdd = function(x) { return x & 1; };
var isEven  = function(x) { return !( x & 1 ); };
0x499602D2
sumber
5
+1, jawaban Anda pasti mengalahkan milik saya, belum lagi Anda memiliki satu-satunya jawaban yang tidak digunakan X % Y!
s0d4pop
4
Saya tidak yakin apakah pengujian saya akurat, tetapi bitwise AND tampaknya 40 kali lebih lambat daripada operator modulo untuk nomor tetap dan 2 kali lebih lambat untuk nomor acak: jsperf.com/odd-or-even
Blender
8
Perhatikan bahwa ini akan mengembalikan "ganjil" atau "genap" untuk angka yang tidak salah (mis., 3.14).
nnnnnn
2
Atau: function isEven(n){return !(n & 1);} .
RobG
7
@ Gnuey Setiap angka terdiri dari serangkaian bit. Semua angka ganjil memiliki bit paling signifikan (paling kanan) yang ditetapkan ke 1, semua angka genap 0. x & 1Memeriksa apakah bit terakhir diatur dalam angka (karena 1 adalah angka dengan semua bit diatur ke 1 kecuali untuk bit paling tidak signifikan ): Jika adalah , jumlah ini aneh, jika tidak bahkan.
0x499602D2
31

Anda dapat melakukan sesuatu seperti ini:

function isEven(value){
    if (value%2 == 0)
        return true;
    else
        return false;
}
TNC
sumber
9
Sepertinya Anda tidak tahu apa itu boolean. if (condition) { answer=true; } else { answer=false; }adalah versi yang tidak perlu bertele - tele answer = (bool) condition;. Kurangi fungsi Anda function isEven(value) { return (bool) (value%2 == 0); }dan kami semua akan senang.
awm
9
Tidak perlu menjadi sombong, karena saya memprogram sesuatu yang berbeda.
TNC
5
@awm - Sepertinya Anda tidak tahu JavaScript. Anda tidak dapat melakukan cast ke boolean dengan (bool)(yang akan memberikan kesalahan) dan dalam hal apa pun Anda tidak perlu: return value%2 == 0;akan melakukan pekerjaan itu karena ==operator mengembalikan boolean.
nnnnnn
2
Wow, apakah saya benar-benar menulis itu? Ya, itu jelas salah; harus seperti answer = !!(condition). Maksud saya mencoba untuk membuat, tentu saja adalah bahwa Anda bisa saja return value%2==0dan tidak perlu repot dengan persyaratan.
awm
Saya merasa elegan: value%2===0
carlodurso
17
function isEven(x) { return (x%2)==0; }
function isOdd(x) { return !isEven(x); }
CloudyMarble
sumber
13

Apakah saya harus membuat array sangat besar yang memiliki banyak angka genap

Tidak. Gunakan modulus (%). Ini memberi Anda sisa dari dua angka yang Anda bagi.

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.

Ini berarti jika Anda mengubah angka apa saja x x 2, Anda mendapatkan 0 atau 1 atau -1. 0 berarti itu genap. Ada lagi yang berarti aneh.

Isaac Fife
sumber
8

Ini dapat diselesaikan dengan potongan kode kecil:

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

Semoga ini membantu :)

s0d4pop
sumber
6

Seperti banyak bahasa, Javascript memiliki operator modulus% , yang menemukan sisa pembagian. Jika tidak ada sisa setelah pembagian dengan 2, jumlahnya genap:

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

Ini adalah ungkapan yang sangat umum untuk pengujian bahkan untuk bilangan bulat.

pb2q
sumber
3
Namun, modulus dapat menjadi rumit / tidak terdefinisi untuk nilai negatif .. pastikan untuk berkonsultasi dengan spesifikasi bahasa yang sesuai.
6

Dengan bitwise, codegolfing:

var isEven=n=>(n&1)?"odd":"even";
Katia Punter
sumber
5

Fungsi sederhana yang bisa Anda bagikan. Menggunakan operator modulo %:

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

is_even(3)
false
is_even(6)
true
dgh
sumber
1
Jika hasil Anda di operator ternary 'benar' atau 'salah', Anda benar-benar tidak memerlukan operator ternary. Di sini, Anda bisa / hanya harus melakukan:return !(x % 2);
dom_watson
4

Gunakan ekstensi saya:

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

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

kemudian

var a=5; 
 a.isEven();

== Salah

 a.isOdd();

== Benar

jika Anda tidak yakin apakah itu suatu Angka, ujilah dengan percabangan berikut:

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

PEMBARUAN:

jika Anda tidak akan menggunakan variabel:

(5).isOdd()

Kinerja:

Ternyata paradigma prosedural lebih baik daripada paradigma OOP. Omong-omong, saya melakukan profiling di FIDDLE ini . Namun, cara OOP masih tercantik.

masukkan deskripsi gambar di sini

Abdennour TOUMI
sumber
Terima kasih Bung, untuk logika ini, dalam orang yang diwawancarai seseorang bertanya logika semacam ini, tidak bisa menjawab, sekarang saya mengerti, terima kasih .. tetapi apakah ada manfaat dalam kinerja dengan mengikuti metode ini? kita bisa menulis isEven (x); dll
Shoib Mohammed A
@ShoibMohammedA: Perbandingan telah dilakukan! jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI
-1 tidak memperluas fungsi prototipe asli. ( stackoverflow.com/questions/14034180/… )
tfmontague
3

Kurangi 2 untuk itu secara rekursif sampai Anda mencapai -1 atau 0 (hanya bekerja untuk bilangan bulat positif) :)

asimetris
sumber
Dengan angka negatif Anda malah menambah 2 untuk itu
Hydroper
Dan itu membutuhkan waktu ketika n = 2 ^ 52, dan jumlah tak terbatas untuk n> 2 ^ 53
rioV8
3

Anda bisa menggunakan pernyataan for dan conditional untuk menentukan apakah angka atau serangkaian angka ganjil:

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

Ini akan mencetak setiap nomor ganjil antara 1 dan 5.

cheekybastard
sumber
3

Baru saja menjalankan yang ini di Adobe Dreamweaver..itu berfungsi dengan baik. saya dulu if (isNaN (mynmb))

untuk memeriksa apakah Nilai yang diberikan adalah angka atau tidak, dan saya juga menggunakan Math.abs (mynmb% 2) untuk mengubah angka negatif menjadi positif dan menghitung

    <!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>
Srivastav
sumber
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>
Kirandeep Singh
sumber
2
if (X % 2 === 0){
} else {
}

Ganti X dengan nomor Anda (bisa berasal dari variabel). Pernyataan If berjalan ketika nomornya genap, Yang lain ketika itu ganjil.

Jika Anda hanya ingin tahu apakah nomor yang diberikan aneh:

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

Sekali lagi, ganti X dengan angka atau variabel.

Gui Premonsa
sumber
2

Setiap angka ganjil ketika dibagi dua meninggalkan sisa sebagai 1 dan setiap angka genap ketika dibagi dengan nol meninggalkan nol sebagai sisa. Karenanya kita dapat menggunakan kode ini

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

Bagaimana dengan ini...

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

    alert(aa[num % 2]);
AndroidManifester
sumber
2

Inilah yang saya lakukan

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

Untuk beberapa alasan saya harus memastikan panjang array kurang satu per satu. Ketika saya tidak melakukan itu, saya mendapatkan "undefined" di elemen terakhir dari array oddNumbers.

Zakher Masri
sumber
2
Itu karena kondisi diatur ke kurang atau sama dengan "<=" dengan panjang array. Saya menghapus tanda sama dengan dan hasilnya seperti yang diinginkan.
Zakher Masri
2

Ketika Anda perlu menguji apakah beberapa variabel aneh, Anda harus terlebih dahulu menguji apakah itu bilangan bulat . Juga, perhatikan bahwa ketika Anda menghitung sisanya pada angka negatif, hasilnya akan negatif ( -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
}

Jika Number.isInteger tersedia, Anda juga dapat menyederhanakan kode ini menjadi:

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

Catatan: di sini, kami menguji value % 2 !== 0bukan value % 2 === 1karena -3 % 2 === -1. Jika Anda tidak ingin -1lulus tes ini, Anda mungkin perlu mengubah baris ini.

Berikut ini beberapa kasus uji:

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
tsh
sumber
2

Menggunakan % akan membantu Anda melakukan ini ...

Anda dapat membuat beberapa fungsi untuk melakukannya untuk Anda ... Saya lebih suka fungsi separte yang tidak terlampir ke Nomor dalam Javascript seperti ini yang juga memeriksa apakah Anda memberikan nomor atau tidak:

fungsi aneh:

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

bahkan fungsi:

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

dan menyebutnya seperti ini:

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
Alireza
sumber
2

Satu liner di ES6 hanya karena bersih.

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

sial
sumber
2

Banyak orang salah paham arti aneh

  • isOdd("str")harus salah.
    Hanya bilangan bulat yang bisa aneh.
  • isOdd(1.223)dan isOdd(-1.223)harus salah.
    Float bukan bilangan bulat.
  • isOdd(0)harus salah.
    Nol adalah bilangan bulat genap ( https://en.wikipedia.org/wiki/Parity_of_zero ).
  • isOdd(-1)harus benar.
    Ini bilangan bulat aneh.

Larutan

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 (jika perlu): https://jsfiddle.net/9dzdv593/8/

1-liner

Solusi Javascript 1-liner. Bagi mereka yang tidak peduli tentang keterbacaan.

const isOdd = n => !(isNaN(n) && ((n % 1) !== 0) && (n === 0)) && ((n % 2) !== 0) ? true : false;
Timbul
sumber
Anda dapat mempercepat solusinya. yaitu, dalam pernyataan akhir Anda hanya dapat kembali !! (n% 2), ini opsional akan membuatnya bekerja dengan angka yang ditandatangani (yaitu, ketika n% 2 mengembalikan 0, itu salah, tetapi ketika -1 atau 1 kembali, ini akan mengembalikan true). Solusi Anda sebenarnya mengembalikan false untuk bilangan ganjil karena memeriksa apakah modulus return adalah 0, tetapi harus memeriksa 1, dan 1 akan gagal untuk bilangan negatif, sehingga mengembalikan !! (n% 2) lebih aman. Lagi pula, {} (blok pernyataan) tidak menyebabkan masalah minifikasi dan tidak hadir dalam diskusi.
Hydroper
@TheProHands - Terima kasih atas catatannya. (1) Masalahnya adalah bahwa Versi Modulus memiliki kesalahan ketik; seharusnya (n % 2) !== 0bukan (n % 2) === 0. (2) Saran saya adalah untuk menghindari !!(n % 2), karena (a) ia memiliki kinerja lebih lambat daripada (n % 2) !== 0( jsperf.com/notnot-vs-strict-not ), (b) ini adalah peretasan - ini memunculkan nilai falsey 0ke dalam false, dan (c) itu tidak jelas (bahasa pemrograman tingkat tinggi tidak boleh dibaca seperti Pascal demi kinerja - itulah tugas kompiler). (3) Ya, {}pernyataan blokir yang hilang menghasilkan beberapa masalah (sebagaimana diperbarui dalam jawaban saya).
tfmontague
Saya tidak pernah menghindari pernyataan blok karena saya peduli tentang keterbacaan, tetapi saya mencoba untuk mengatakan bahwa mencari pernyataan blok tidak menimbulkan masalah, hanya dalam pemeliharaan kode. Yaitu, menggunakan ekspresi urutan digabungkan dengan pernyataan ekspresi daripada pernyataan blok mungkin membuat kode tidak dapat dibaca dan jelek, yaitu:, if (0) call1(), assign = 0, call2()tetapi satu pernyataan tidak buruk if (0) return; if (0) ;; if (0); break; if (0) continue;:, dan lagi pula saya lebih suka untuk terus menggunakan pernyataan blok break-line ketika saya sudah kondisi garis panjang.
Hydroper
Jenis / null cek seperti Anda isNaN(n)adalah konyol - yakin Anda menutupi NaNkasus, tapi isOdd(null), isOdd(undefined), isOdd({x:1})semua kembali falseyang saya anggap sebagai kesalahan; kecuali tentu saja Anda hanya menentukan bahwa fungsi Anda memiliki perilaku yang benar di atas domain yang diberikan: hanya input tipe-angka. Dalam hal ini, cukup isNaNcentang dan paksa pengguna untuk memanggilnya dengan jenis yang benar. Pemrograman defensif mengerikan. Maka fungsi Anda disederhanakan menjadi isOdd = x => Math.floor(x) === x && x & 1 === 1- mengembalikan eksplisit trueatau falsenilai tidak diperlukan
Terima kasih
null, undefineddan objek {}bukan bilangan bulat ganjil, dan karena itu fungsinya kembali false- tidak yakin mengapa Anda menganggap itu kesalahan. The isNaNcheck adalah untuk kinerja (tidak untuk pertahanan), memungkinkan fungsi keluar sebelum waktunya tanpa melakukan pemeriksaan lainnya.
tfmontague
1

Saya akan menerapkan ini untuk mengembalikan boolean:

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

Ini akan berfungsi pada nomor yang tidak ditandatangani dan ditandatangani. Ketika modulus kembali -1atau 1itu akan diterjemahkan true.

Solusi non-modulus:

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;
}
Hydroper
sumber
1

Pendekatan yang lebih fungsional dalam javascript modern:

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)
senjata
sumber
1

dalam ES6:

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

Darryl Mendonez
sumber
3
Saat menambahkan jawaban ke pertanyaan berusia delapan tahun dengan 26 jawaban yang ada, sangat berguna untuk menjelaskan aspek baru dari pertanyaan yang dijawab oleh jawaban Anda, dan jika berlalunya waktu dan versi baru memengaruhi jawaban. Jawaban kode saja hampir selalu dapat ditingkatkan dengan penambahan beberapa penjelasan dan dalam hal ini beberapa contoh panggilan yang menunjukkan penggunaan.
Jason Aller
1
judulnya adalah 'Bagaimana menentukan apakah suatu angka ganjil dalam JavaScript' dan tidak ada solusi ES6 yang diposting untuk apa yang diminta.
Darryl Mendonez
0

Dengan menggunakan operator ternary, Anda dapat menemukan angka genap ganjil:

var num = 2;
result = (num % 2 == 0) ? 'even' : 'odd'
console.log(result);

Mahendra Kulkarni
sumber
0

ini berfungsi untuk array:

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

ini harus keluar: 4,92 1,9,21,41

hanya untuk nomor:

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

  return "odd";
}

console.log(evenOrOdd(4));

ini akan menghasilkan bahkan ke konsol

JuicY_Burrito
sumber