값이 홀수인지 또는 짝수인지 테스트


173

매우 간단한 알고리즘으로 간단한 isEvenisOdd 함수 를 작성하기로 결정했습니다 .

function isEven(n) {
  n = Number(n);
  return n === 0 || !!(n && !(n%2));
}

function isOdd(n) {
  return isEven(Number(n) + 1);
}

n에 특정 매개 변수가 있으면 괜찮지 만 많은 시나리오에서 실패합니다. 그래서 가능한 많은 시나리오에 대해 올바른 결과를 제공하는 강력한 함수를 만들기 시작했습니다. 따라서 자바 스크립트 수 한도 내의 정수 만 테스트하고 다른 모든 것은 false (+ 및-무한대 포함)를 반환합니다. 0은 짝수입니다.

// 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에 대한 명확한 버전을 찾을 수 없습니다.


답변:


368

계수 사용 :

function isEven(n) {
   return n % 2 == 0;
}

function isOdd(n) {
   return Math.abs(n % 2) == 1;
}

다음을 사용하여 Javascript의 값을 숫자로 강제 변환 할 수 있는지 확인할 수 있습니다.

Number.isFinite(parseFloat(n))

이 검사는 isEvenand isOdd함수 외부에서 수행하는 것이 바람직 하므로 두 함수에서 오류 처리를 복제 할 필요가 없습니다.


@Steve 예.하지만 JS가 value숫자가 아니거나 숫자 인 경우에도 특별한 문제 가 있습니다. 예는 : 0.1%2, NaN%2, []%2, 등 당신이이 질문에 대해 쓴, 그는 이미 그것을 알고있다.
Alin Purcaru 2016 년

1
0.1그리고 NaN위의 기능이 잘 작동. 빈 배열은 0과 같기 때문에 약간의 고통입니다 ...
Steve Mayne

4
@Alin-숫자 확인을 추가했습니다. 다른 데이터 유형을 명시 적으로 처리하기 위해 산술 함수를 원할 때 시나리오를 이해하지 못하지만 OP가 원하는 경우 ...
Steve Mayne

2
로 바꾸는 return n == parseInt(n);것은 return n === parseInt(n);어떻습니까?
JiminP

2
n % 2 !== 0언어에 따라 반드시 1이 아니기 때문에 홀수를 확인할 때 확인 해야 할 부분을 ​​읽은 것 같습니다 . 편집 : 아, 그게 .abs전화입니다. 그럼 신경 쓰지 마
ptf

79

비트 테스트를 선호합니다.

if(i & 1)
{
    // ODD
}
else
{
    // EVEN
}

홀수를 나타내는 첫 번째 비트가 켜져 있는지 테스트합니다.


내가 시작하는 숫자 임을 아는 경우에만 유용합니다 . 숫자가 아닌 숫자는 정의되지 않은 상태로 반환해야합니다 (또는 오류가 발생할 수 있지만 정의되지 않은 것으로 보이는 경우).
RobG

3
물론. 기본 -2 수학에 모듈러스를 사용하는 것은 불법입니다;)
aceofspades

4
Ternary : i & 1 == 1 ? console.log("odd") : console.log("even");비트 레벨 효율성에 대한 +1 (JS에서는 널리 사용되지 않음)
Jacksonkr

13
@Jacksonkr JavaScript에서 모든 숫자가 부동 소수점이므로 비트 단위 효율성이 없다는 점에 유의하십시오. 비트 연산자를 사용한다는 것은 먼저 int로 변환 한 다음 연산을 수행 한 다음 부동 소수점 숫자로 다시 변환하는 것을 의미합니다.
찌를

1
@poke 그것들은 Number 타입이지만 올바른 타입의 언어에는 효율성이 있다는 것을 아는 것이 좋습니다.
Robert Brisita

8

다음은 어떻습니까? 나는 이것을 IE에서만 테스트했지만 모든 길이의 숫자, 정수 또는 실수 인 실제 숫자를 나타내는 문자열을 처리하는 것이 매우 기뻤으며 부울, 정의되지 않은, null, 배열 또는 객체를 전달하면 두 함수 모두 false를 반환했습니다. (문자열이 전달 될 때 선행 또는 후행 공백을 무시할지 여부는 사용자에게 달려 있습니다. 무시 되지 않으며 두 함수가 모두 false를 반환 한다고 가정했습니다 .)

function isEven(n) {
   return /^-?\d*[02468]$/.test(n);
}

function isOdd(n) {
   return /^-?\d*[13579]$/.test(n);
}

2
내 구현에서 isEven (2.122e3)은 true를 반환하지만 isEven ( "2.122e3")은 false를 반환합니다. 반대로 JS가 정규식 테스트를 위해 문자열로 변환 할 때 지수 형식으로 넣기 때문에 실제로 큰 숫자에 대해 isEven ()이 실패합니다. 오 잘
nnnnnn

@MartijnScheffer-구매해야 할 추가 메모리에 대한 청구서를 보내주십시오. 질문에는 다른 유형에서 숫자로의 변환이 포함되었으며 여기에서 제안하는 요점은 숫자 문자열 을 처리하는 간단한 한 줄 함수를 갖는 것입니다 . 물론 내 의견에 따르면 실제로 모든 가능한 경우를 처리하지는 않지만 여전히 유용 할 수 있습니다 .regex는 사용자가 입력 한 데이터의 유효성을 검사하는 가장 간단한 방법이며 처음에는 문자열입니다.
nnnnnn

여기에 의견을 게시 했습니까? 나는 그것을 보지 못하지만, 당신이 하나를 원한다면 할 수 있습니다!, 이것은 올바른 해결책이 아닙니다, 이것은 수백 배 느립니다. 우리는 문자열이 유효한지 확인하고 싶다면 문자열이 아닌 숫자에 대해 이야기하고 있습니다. 숫자, 그리고 별도로 처리 할 수있는 정수.
Martijn Scheffer

@MartijnScheffer-예, 귀하로부터 의견이 있었으며, 답장 후 어느 시점에서 삭제 된 것으로 보입니다. 질문은 숫자에 관한 것이 아니라 OP의 코드에는 다른 유형의 변환이 포함되어 있습니다. 어쨌든 의견을 보내 주셔서 감사합니다.
nnnnnn

7

참고 : 음수도 있습니다.

function isOddInteger(n)
{
   return isInteger(n) && (n % 2 !== 0);
}

어디

function isInteger(n)
{
   return n === parseInt(n, 10);
}

1
여기에 기수가 필요하지 않습니까?
blablabla

@blablabla 예, 모든 구현에서 기수 = 10을 가정하는 것은 아닙니다.
Rodrigo

음수 값에 대한 인용 Robert Brisita의 답변 (나중에 추가됨)도이 내용을 다룹니다.
Jacksonkr

4

왜 이렇게하지 않습니까?

    function oddOrEven(num){
        if(num % 2 == 0)
            return "even";
        return "odd";
    }
    oddOrEven(num);

또는 심지어 function isEven(num) { return num % 2 == 0}
chiapa

3
또는 ES6와 함께 :const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
enguerran

4

Robert Brisita의 비트 테스트를 완료하려면.

if ( ~i & 1 ) {
    // Even
}

1
var isEven = function(number) {
    // Your code goes here!
    if (number % 2 == 0){
       return(true);
    }
    else{
       return(false);    
    }
};

2
if ( <expression> ) return true else return false패러다임은 수 항상 로 단순화 할 return ( <expression> )(AN의 표현이 있기 때문에 if 이미 항상 부울이다)를.
Gerold Broser 17 년

반환이 함수가 아니라고 말하는 것은 함수가 아닌 경우를 말하는 것과 같습니다. 값을 반환 할 때 괄호를 사용하는 것이 좋습니다 (여기서 유용하지 않더라도)
Martijn Scheffer

1

Steve Mayne의 간단한 수정 / 개선 답변!

function isEvenOrOdd(n){
    if(n === parseFloat(n)){
        return isNumber(n) && (n % 2 == 0);
    }
    return false;
}

참고 : 유효하지 않은 경우 false를 반환합니다!


1

이를 위해 한 줄의 코드 만 있으면됩니다!

JS 함수에 대한 새로운 ES6 구문과 명령문 호출에 대한 한 줄 구문 을 사용하여이를 수행하는 새롭고 대안적인 방법입니다 if-else.

const isEven = num => ((num % 2) == 0) ? true : false;

alert(isEven(8));  //true
alert(isEven(9));  //false
alert(isEven(-8)); //true

1
어느 것이 더 짧습니다 let isEven = num => num % 2 === 0. :-) 그러나 실제로 다른 답변들과 다르지 않습니다.
RobG

1

x % 2 == 0; // Check if even

!(x & 1); // bitmask the value with 1 then invert.

((x >> 1) << 1) == x; // divide value by 2 then multiply again and check against original value

~x&1; // flip the bits and bitmask

0

다른 방법:

var isEven = function(number) {
  // Your code goes here!
  if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;};
};

isEven(69)

0

그렇지 않으면 왜 문자열을 사용합니까?

function isEven(__num){
    return String(__num/2).indexOf('.') === -1;
}

0
if (testNum == 0);
else if (testNum % 2  == 0);
else if ((testNum % 2) != 0 );

아무런 설명도없이 당신의 기여는 그다지 가치가 없습니다. 또한 토론에서 이미 제시된 정보를 반복합니다.
Cindy Meister

고마워 신디! 솔루션을 제공하는 것뿐입니다!
Lindsay

하지만 ... 이것은 실제로하지 않습니다 것을. 뭔가를 반환해서는 안됩니까?
nnnnnn

0

어쩌면? if (ourNumber % 2! == 0)


2
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다. 설명 주석으로 코드를 복잡하게 만들지 마십시오. 이렇게하면 코드와 설명의 가독성이 떨어집니다!
Filnor

0
var num = someNumber
    isEven;
parseInt(num/2) === num/2 ? isEven = true : isEven = false;

0

for(var a=0; a<=20;a++){
   if(a%2!==0){
       console.log("Odd number "+a);
   }
}

for(var b=0; b<=20;a++){
    if(b%2===0){
        console.log("Even number "+b);  
    }     
 }


이 코드가 문제를 해결하는 방법과 이유에 대한 설명포함 하여 질문을 해결할 수는 있지만 게시물의 품질을 향상시키는 데 도움이되고 더 많은 투표를 할 수 있습니다. 지금 질문하는 사람 만이 아니라 앞으로 독자들에게 질문에 대답하고 있음을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Daniil

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

-1

현대적인 자바 스크립트 스타일 사용하기 :

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)

isOdd('5'))true를 반환합니다. isEven('5')또한 true를 반환합니다. isOdd(NaN)오류가 발생합니다. :-(
RobG

고정 isEven('5'). isOdd(NaN)아마도 오류가 발생해야합니다.

1
스크립트 호스트는 오류를 처리하지 않아야합니다. 나는 항상 코어 덤프가 정상 종료가 아니라고 들었다 . ;-)
RobG


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


또는 return parseInt(n)%2===0?true:parseInt(n)===0. 그러나 다시, 이것은 이미 여기에있는 다른 많은 답변들과 동일합니다.
Heretic Monkey

1
또는 return parseInt(n)%2 === 0 || parseInt(n) === 0. 그러나 왜 파싱 합니까? "32foo"와 같은 값에 대해서는 true를 반환합니다 12.5.
RobG

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.