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


173

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

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.