Cách xác định xem một số có lẻ không trong JavaScript


245

Bất cứ ai cũng có thể chỉ cho tôi một số mã để xác định xem một số trong JavaScript là chẵn hay lẻ?



1
@DavidThomas Tôi đồng ý một phần, nhưng tôi có hai cảnh báo: 1. Nếu tôi phải chọn, tôi muốn một lập trình viên mới bắt đầu biết về %toán tử hơn &và 2. Mặc dù &về mặt lý thuyết nhanh hơn, nó thực sự không thành vấn đề .
kojiro

3
@kojiro: Tôi muốn có nhiều tùy chọn (hợp lệ) hơn được trình bày cho người học; cộng với tôi chưa từng nghĩ sẽ sử dụng bitwise- & theo cách này trước đây, vì vậy đó là một cách thú vị. Dù sao, vì nó một bản dupe, tôi đã gắn cờ để sáp nhập với câu hỏi đã có từ trước. Hy vọng, sau đó, câu trả lời ở đây (ít nhất là câu trả lời cụ thể), sẽ không bị mất.
David nói phục hồi Monica

1
@kojiro Tôi sợ nói rằng fiddle của bạn khá vô dụng, vì hầu hết thời gian tính toán được thực hiện bởi các lệnh gọi hàm. Nhưng không ai sẽ sử dụng một cuộc gọi chức năng để xác định xem một số là số lẻ hay thậm chí ... Tôi đã thực hiện bản sửa đổi thứ ba của bài kiểm tra của bạn, nhưng giờ tôi đang ở trên điện thoại của mình ...
MaxArt

Câu trả lời:


346

Sử dụng mã dưới đây:

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 đại diện cho một số lẻ, trong khi 0 đại diện cho một số chẵn.


97
Lưu ý rằng điều này sẽ trở lại 0hoặc 1(hoặc NaNnếu bạn cung cấp cho nó thứ gì đó không phải là số và không thể bị ép buộc thành một), sẽ hoạt động tốt trong hầu hết các tình huống. Nhưng nếu bạn muốn có thật truehoặc false:return (num % 2) == 1;
TJ Crowder

3
phải lưu ý tốt về NaN. Nhưng thông thường, bạn muốn javascript là sự thật hoặc falsey, đó là lý do tại sao tôi đã viết nó theo cách tôi đã làm.
Chii

9
Chỉ cần làm rõ, toán tử modulo (%) đưa ra phần còn lại của một phép chia. Vì vậy, 3% 2 sẽ là 3/2, còn lại 1 là phần còn lại, do đó 3% 2 sẽ trở lại 1.
Abuh

6
Hơn nữa với những gì TJ đã nói, điều này sẽ trả về một phân số nếu numkhông phải là số nguyên. Sẽ vẫn hoạt động nếu bạn so sánh isOdd(1.5)==true(vì giá trị phân số không bằng true), nhưng sẽ tốt hơn nếu hàm được trả về truehoặc được falsengụ ý bởi tên "isOdd".
nnnnnn

6
Bạn cũng có thể làm return !!(num % 2)để có được một boolean
Duncan

115

Sử dụng toán ANDtử 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>

Nếu bạn không muốn giá trị trả về chuỗi, mà là giá trị boolean, hãy sử dụng giá trị này:

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

5
+1, câu trả lời của bạn chắc chắn sẽ đánh bại tôi, chưa kể rằng bạn có câu trả lời duy nhất không sử dụng X % Y!
s0d4pop

4
Tôi không chắc liệu thử nghiệm của mình có chính xác hay không, nhưng bitwise AND dường như chậm hơn 40 lần so với toán tử modulo cho một số cố định và chậm hơn 2 lần cho một số ngẫu nhiên: jsperf.com/odd-or-even
Blender

8
Lưu ý rằng điều này sẽ trả về "lẻ" hoặc "chẵn" cho các số không phải (ví dụ: 3.14).
nnnnnn

2
Hoặc : function isEven(n){return !(n & 1);}.
RobG

7
@Gnuey Mỗi số bao gồm một loạt các bit. Tất cả các số lẻ có bit có ý nghĩa nhỏ nhất (ngoài cùng bên phải) được đặt thành 1, tất cả các số chẵn 0. Việc x & 1kiểm tra nếu bit cuối cùng được đặt trong số (vì 1 Là một số có tất cả các bit được đặt thành 1 ngoại trừ bit có trọng số thấp nhất ): Nếu , số là số lẻ, nếu không thì chẵn.
0x499602D2

31

Bạn có thể làm một cái gì đó như thế này:

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

9
Có vẻ như bạn không biết boolean là gì. if (condition) { answer=true; } else { answer=false; }chỉ là một phiên bản dài dòng không cần thiết của answer = (bool) condition;. Giảm chức năng của bạn xuống function isEven(value) { return (bool) (value%2 == 0); }và tất cả chúng ta sẽ hạnh phúc.
awm

9
Không cần phải nhận được snarky, bởi vì tôi lập trình một cái gì đó khác nhau.
TNC

5
@awm - Có vẻ như bạn không biết JavaScript. Bạn không thể chuyển sang boolean với (bool)(điều đó sẽ gây ra lỗi) và trong mọi trường hợp bạn không cần: return value%2 == 0;sẽ thực hiện công việc kể từ khi ==toán tử trả về boolean.
nnnnnn

2
Wow, tôi đã thực sự viết điều đó? Vâng, điều đó rõ ràng là sai; nên là một cái gì đó như answer = !!(condition). Tất nhiên, điểm tôi đang cố gắng thực hiện là bạn có thể return value%2==0và không cần bận tâm đến điều kiện.
awm

Tôi thấy nó thanh lịch: value%2===0
carlodurso

17
function isEven(x) { return (x%2)==0; }
function isOdd(x) { return !isEven(x); }

13

Tôi có phải làm cho một mảng thực sự lớn có nhiều số chẵn không

Không. Sử dụng mô đun (%). Nó cung cấp cho bạn phần còn lại của hai số bạn đang chia.

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.

Điều này có nghĩa là nếu bạn sửa đổi bất kỳ số x nào bằng 2, bạn sẽ nhận được 0 hoặc 1 hoặc -1. 0 có nghĩa là nó thậm chí. Bất cứ điều gì khác có nghĩa là nó kỳ lạ.


8

Điều này có thể được giải quyết bằng một đoạn mã nhỏ:

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

Hi vọng điêu nay co ich :)


6

Giống như nhiều ngôn ngữ, Javascript có toán tử mô đun% , tìm thấy phần còn lại của phép chia. Nếu không có phần dư sau khi chia cho 2, một số chẵn là:

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

Đây là một thành ngữ rất phổ biến để thử nghiệm cho các số nguyên chẵn.


3
Tuy nhiên, mô-đun có thể khó / không xác định cho các giá trị âm .. hãy chắc chắn tham khảo đặc tả ngôn ngữ phù hợp.


5

Một chức năng đơn giản bạn có thể vượt qua. Sử dụng toán tử modulo %:

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

is_even(3)
false
is_even(6)
true

1
Nếu kết quả của bạn trong toán tử ternary là 'true' hoặc 'false', bạn thực sự không cần toán tử ternary. Tại đây, bạn có thể / chỉ nên làm:return !(x % 2);
dom_watson

4

Sử dụng tiện ích mở rộng của tôi:

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

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

sau đó

var a=5; 
 a.isEven();

== Sai

 a.isOdd();

== Đúng

nếu bạn không chắc chắn đó có phải là Số hay không, hãy kiểm tra nó bằng cách phân nhánh sau:

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

CẬP NHẬT:

nếu bạn không sử dụng biến:

(5).isOdd()

Hiệu suất :

Nó chỉ ra rằng mô hình Thủ tục tốt hơn mô hình OOP. Nhân tiện, tôi đã thực hiện hồ sơ trong FIDDLE này . Tuy nhiên, cách OOP vẫn đẹp nhất.

nhập mô tả hình ảnh ở đây


Cảm ơn anh bạn, vì logic này, khi được phỏng vấn, có người đã hỏi loại logic này, không thể trả lời, bây giờ tôi đã hiểu, cảm ơn .. nhưng có lợi ích gì trong việc thực hiện bằng phương pháp này không? chúng ta có thể đã viết isEven (x); v.v.
Shoib Mohammed A

@ShoibMohammedA: So sánh đã được thực hiện! jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI

-1 không mở rộng các chức năng nguyên mẫu. ( stackoverflow.com/questions/14034180/
Mạnh

3

Trừ 2 cho nó một cách đệ quy cho đến khi bạn đạt -1 hoặc 0 (rõ ràng chỉ hoạt động đối với các số nguyên dương) :)


Với số âm, thay vào đó bạn tăng 2 lên
Hydroper

Và phải mất một thời gian khi n = 2 ^ 52 và số tiền vô hạn cho n> 2 ^ 53
rioV8

3

Bạn có thể sử dụng câu lệnh for và điều kiện để xác định xem một số hoặc dãy số có phải là số lẻ không:

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

Điều này sẽ in mọi số lẻ từ 1 đến 5.


3

Chỉ cần thực hiện điều này trong Adobe Dreamweaver..it hoạt động hoàn hảo. tôi đã sử dụng nếu (isNaN (mynmb))

để kiểm tra xem Giá trị đã cho có phải là số hay không và tôi cũng đã sử dụng Math.abs (mynmb% 2) để chuyển đổi số âm thành dương và tính toán

    <!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 {
}

Thay thế X bằng số của bạn (có thể đến từ một biến). Câu lệnh If chạy khi số chẵn, Khác khi nó là số lẻ.

Nếu bạn chỉ muốn biết nếu có bất kỳ số nào là số lẻ:

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

Một lần nữa, thay thế X bằng một số hoặc biến.


2

Mỗi số lẻ khi chia cho hai lá còn lại là 1 và mọi số chẵn khi chia cho 0 sẽ để lại số 0 là số dư. Do đó chúng ta có thể sử dụng mã này

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


2

Đây là những gì tôi đã làm

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

Vì một số lý do, tôi phải đảm bảo độ dài của mảng nhỏ hơn một. Khi tôi không làm điều đó, tôi nhận được "không xác định" trong phần tử cuối cùng của mảng lẻNumbers.


2
Đó là vì điều kiện được đặt thành nhỏ hơn hoặc bằng "<=" với độ dài của mảng. Tôi đã loại bỏ dấu bằng và kết quả là như mong muốn.
Zakher Masri

2

Khi bạn cần kiểm tra xem một số biến có phải là số lẻ hay không, trước tiên bạn nên kiểm tra xem nó có phải là số nguyên không . Ngoài ra, lưu ý rằng khi bạn tính phần còn lại trên số âm, kết quả sẽ là âm ( -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
}

Nếu Number.isInteger khả dụng, bạn cũng có thể đơn giản hóa mã này thành:

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

Lưu ý: ở đây, chúng tôi kiểm tra value % 2 !== 0thay vì value % 2 === 1là vì -3 % 2 === -1. Nếu bạn không muốn -1vượt qua bài kiểm tra này, bạn có thể cần phải thay đổi dòng này.

Dưới đây là một số trường hợp thử nghiệm:

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

Sử dụng % sẽ giúp bạn làm điều này ...

Bạn có thể tạo một vài hàm để làm điều đó cho bạn ... Tôi thích các hàm separte không được gắn với Số trong Javascript như thế này cũng kiểm tra xem bạn có chuyển số hay không:

hàm lẻ:

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

hàm chẵn:

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

và gọi nó như thế này:

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

Một lớp lót trong ES6 chỉ vì nó sạch.

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


2

Nhiều người hiểu nhầm ý nghĩa của lẻ

  • isOdd("str")nên sai
    Chỉ một số nguyên có thể là số lẻ.
  • isOdd(1.223)isOdd(-1.223)nên sai.
    Một float không phải là một số nguyên.
  • isOdd(0)nên sai
    Số không là số nguyên chẵn ( https://en.wikipedia.org/wiki/Parity_of_zero ).
  • isOdd(-1)nên đúng
    Đó là một số nguyên lẻ.

Giải pháp

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

Fiddle JS (nếu cần): https://jsfiddle.net/9dzdv593/8/

1-lót

Giải pháp Javascript 1-liner. Đối với những người không quan tâm về khả năng đọc.

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

Bạn có thể tăng tốc giải pháp chưa. tức là, trong các báo cáo cuối cùng bạn chỉ có thể trả về !! (n% 2), điều này sẽ tùy ý làm cho nó hoạt động với các số đã ký (nghĩa là khi n% 2 trả về 0, thì sai, nhưng khi trả về -1 hoặc 1, điều này sẽ trở lại trả lại đúng). Giải pháp của bạn thực sự trả về sai cho các số lẻ vì nó kiểm tra xem mô đun trả về có phải là 0 hay không, nhưng nên kiểm tra 1 và 1 sẽ không thành công cho các số âm, do đó trả về !! (n% 2) sẽ an toàn hơn. Và dù sao đi nữa, {} (tuyên bố khối) không gây ra vấn đề thu nhỏ và không có trong cuộc thảo luận.
Hydroper

@TheProHands - Cảm ơn bạn đã ghi chú. (1) Vấn đề là Phiên bản Modulus có lỗi đánh máy; nó cần phải có được (n % 2) !== 0thay vì (n % 2) === 0. (2) Lời khuyên của tôi là tránh !!(n % 2), bởi vì (a) nó có hiệu suất chậm hơn (n % 2) !== 0( jsperf.com/notnot-vs-strict-not ), (b) đó là một hack - nó ép giá trị falsey 0vào falsevà (c) nó tối nghĩa (ngôn ngữ lập trình cấp cao không nên đọc như Pascal vì mục đích hiệu suất - đó là công việc của nhà soạn nhạc). (3) Có, {}các câu lệnh chặn bị thiếu sẽ dẫn đến một số vấn đề (như được cập nhật trong câu trả lời của tôi).
tfmontague

Tôi không bao giờ tránh các câu lệnh chặn vì tôi quan tâm đến khả năng đọc, nhưng tôi đang cố gắng nói rằng việc tìm kiếm các câu lệnh chặn không dẫn đến các vấn đề, chỉ trong việc duy trì mã. Tức là, sử dụng biểu thức chuỗi được hợp nhất với câu lệnh biểu thức thay vì câu lệnh khối có thể làm cho mã không thể đọc được và xấu, nghĩa là: if (0) call1(), assign = 0, call2()nhưng một câu lệnh không tệ: if (0) return; if (0) ;; if (0); break; if (0) continue;và dù sao tôi vẫn thích tiếp tục sử dụng câu lệnh chặn dòng khi tôi điều kiện nội tuyến dài.
Hydroper

kiểm tra loại / null như bạn isNaN(n)là ngớ ngẩn - chắc chắn rằng bạn bao gồm các NaNtrường hợp, nhưng isOdd(null), isOdd(undefined), isOdd({x:1})tất cả trở lại falsemà tôi cho là một lỗi; tất nhiên trừ khi bạn chỉ xác định rằng chức năng của bạn có hành vi đúng đối với một miền nhất định: chỉ các đầu vào loại Số. Trong trường hợp đó, chỉ cần bỏ isNaNkiểm tra và buộc người dùng gọi nó với đúng loại. Lập trình phòng thủ là khủng khiếp. Sau đó, chức năng của bạn được đơn giản hóa thành isOdd = x => Math.floor(x) === x && x & 1 === 1- trả lại giá trị rõ ràng truehoặc falsekhông cần thiết
Cảm ơn bạn vào

null, undefinedVà các đối tượng{} không phải là số nguyên lẻ, và do đó trở về chức năng false- không chắc chắn lý do tại sao bạn xem xét rằng một lỗi. Các isNaNkiểm tra là để thực hiện (không phải cho quốc phòng), nó cho phép lối ra chức năng sớm mà không thực hiện việc kiểm tra khác.
tfmontague

1

Tôi sẽ thực hiện điều này để trả về một boolean:

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

Nó sẽ hoạt động trên cả số chưa ký và số đã ký. Khi mô đun trở lại -1hoặc 1nó sẽ được dịch sangtrue .

Giải pháp không mô đun:

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

Một cách tiếp cận chức năng hơn trong javascript hiện đại:

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

trong ES6:

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


3
Khi thêm câu trả lời cho câu hỏi tám năm tuổi với 26 câu trả lời hiện có, thật sự hữu ích để giải thích khía cạnh mới của câu hỏi mà bạn trả lời, và nếu thời gian và phiên bản mới tác động đến câu trả lời. Một câu trả lời chỉ có mã hầu như luôn luôn có thể được cải thiện bằng cách thêm một số giải thích và trong trường hợp này, một số cuộc gọi ví dụ hiển thị việc sử dụng.
Jason Aller

1
tiêu đề là 'Cách xác định xem một số có phải là số lẻ trong JavaScript không và không có giải pháp ES6 nào được đăng cho những gì được hỏi.
Darryl Mendonez

0

Bằng cách sử dụng toán tử ternary, bạn có thể tìm thấy các số chẵn lẻ:

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


0

cái này hoạt động cho mảng:

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

điều này nên đăng xuất: 4,92 1,9,21,41

chỉ một số:

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

  return "odd";
}

console.log(evenOrOdd(4));

điều này sẽ xuất ngay cả đến bàn điều khiển

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.