숫자가 소수점 이하 자릿수인지 정수인지 확인하십시오


284

JavaScript에서 숫자가 소수인지 확인하는 쉬운 방법을 찾고 있습니다 (정수인지 확인하기 위해). 예를 들어

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK
if(number is integer) {...}

답변:


820

모듈러스 를 사용 하면 효과가 있습니다.

num % 1 != 0
// 23 % 1 = 0
// 23.5 % 1 = 0.5

이는 형식에 관계없이 숫자의 숫자 을 기반으로 합니다. 고정 소수점이있는 정수를 포함하는 숫자 문자열을 정수와 동일하게 처리합니다.

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5

10
나는 투표하지 않았지만 20.0과 관련이 있으며 여전히 소수점을 가지고 있으며 위의 내용을 충족시킵니다. 어쨌든 나에게 새로운 것을 가르쳐 준 +1 :)
Abe Petrillo

7
@ 아베 : 그것은 사실이라고 생각하지는 않지만 충분합니다. 20.0문자열로 표현되지 않으면 프로그래밍 방식으로 소수점 이 있는지 말할 수 없습니다 . 또한, 다른 솔루션들 중 누구도 그 문제를 해결하지 않은 것에 대해 투표권을 얻지 못했습니다.
Andy

1
@SREEP : 위의 주석을 참조하십시오. 숫자 값으로 표시 될 때 JavaScript에서 0.00은 0.00이 아닙니다. 문자열 ( "0.00")로 표시 될 수 있으며,이 경우 질문은 " 숫자가 정수인지 확인 " 대신 "문자열이 정수 인지 확인" 입니다.
Andy E

3
@Swanidhi : 무슨 뜻인가요? 무엇이 유효하지 않습니까? "10."정수이며, 결과는 정확히 동일합니다 "10"또는 10.
Andy E

3
OP는 NUMBER 가 정수 인지 확인하도록 요청 합니다. 그는 아무데도 끈을 언급하지 않습니다 . 그 점에서 앤디의 대답이 옳습니다.
옴 샨카

58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger () 는 ES6 표준의 일부이며 IE11에서는 지원되지 않습니다.

그것은에 대해 false를 반환 NaN, Infinity및 숫자가 아닌 인수하면서 x % 1 != 0true를 반환합니다.


2
12.0에 대한 솔루션 실패
Vikas Arora

@VikasArora 아니요, 의도 한대로 작동합니다. Number.isInteger(12.0)을 반환합니다 true.
le_m

이것은 정답해야하지만, 불행하게도, 그것은 예를 들어, 과학적 표기법 작동하지 않는 것 같습니다 Number.isInteger('1e3')있다 false하더라도, Number.isInteger(1e3)사실이다. 질문의 의도가 (정수에 소수점이 실제로 존재하는 것이 아닌) 정수가 아닌 값을 찾는 것이라고 가정하면 문자열 값 '12 .0 ' 정수를 나타내는대로 전달 해야 하지만 다시 Number.isInteger('12.0')is false입니다.
brianmearns

@brianmearns OP의 질문은 a number가 전체인지 아닌지입니다. 입력이 문자열 인 경우 물론이 number를 통해 첫 번째 로 변환해야합니다 parseFloat().
le_m

47

또는 이것을 사용하여 소수점이 아닌지 알아낼 수 있습니다.

string.indexOf(".") == -1;

2
이것이 이것이 XX.0에서도 작동하기 때문에 이것이 실제 해결책이라고 생각합니다.
Deepankar Sarkar

5
진행하기 전에 문자열로 변환합니다. 예 : yournumber.toString.indexOf(".")
Daniel Omine

1
francisco_ssb .. 점 기호는 보편적입니다 ... 수학 언어의 소수점 이하 자릿수를 나타냅니다. 이것은 보편적이며 모든 국가에서 작동해야합니다. 쉼표 ( ",")에 대해 이야기한다면 indexOf ( ".") 앞의 점 ( ".")으로 변환해야합니다.
Daniel Omine

1
유로가 소수점 대신 쉼표를 사용하기 때문에 일부 국가에서는 작동하지 않는다고 생각했을 때 통화를 언급하고 있다고 생각합니다. 그러나 질문은 통화에 국한되지 않고 소수에 불과한 소수입니다.
Tessa

1
십진수가 1.00 인 경우 작동하지 않으며 값을 강요하지 않는 한 int가되기를 원합니다.
simon-pr

21

가장 일반적인 해결책은 숫자의 정수 부분을 제거하고 다음과 같이 0과 비교하는 것입니다.

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}

31
왜 안돼 startVal != Math.floor(startVal)?
Andy E

2
좋은. 같은 개념이지만 버전이 더 깨끗합니다.
토마스

1
@Andy E : 양수에만 가능합니다. 음수에는 작동하지 않습니다.
Seeya K

3
@SeeyaK : 물론 음수에 적용됩니다. 자유롭게 사용해보십시오.
Andy E

1
@DeepakGoyal-의도적으로 설계된 것입니다. 이 Math.Floor함수는 10 진수 값을 취하며 JavaScript에서 허용되는 최대 10 진수 값은 2^53 - 1또는 9007199254740991입니다. 이후 893144042145698745.3이 최대 값보다 큰 경우, 함수는 실패 할 것이다.
토마스

20

간단하지만 효과적인!

Math.floor(number) === number;

4
@OmShankar 효율적! = 효과적
피들

Math.floor(3.0) == 3.0사실, Math.floor(3.3) == 3.3거짓입니다
Rohmer

@Fiddles, 맞아, 내가 말하고 싶은 것은 : % mod 방법에 비해 성능이 훨씬 느리기 때문에 비효율적 입니다. 수정 해 주셔서 감사합니다
Om Shankar

19

// 바이트 화는 어떻습니까?

Number.prototype.isInt= function(){
 return this== this>> 0;
}

나는 항상 자바 스크립트에서 비트 연산자에 대해 기분이 좋지 않습니다.

그들은 운동을 거의하지 않습니다.


14
>>값을 부호있는 32 비트 정수 로 변환 하기 때문에 2 ^ 31-1보다 큰 정수의 경우 실패합니다 .
Matthew Crumley

1
@kennebec 굉장합니다. 지금까지 가장 재미있는 솔루션입니다. 그리고 그것은 정규식보다 훨씬 낫습니다.
Daniel B. Chapman

5
number = 20.5

if (number == Math.floor(number)) {

alert("Integer")

} else {

alert("Decimal")

}

꽤 시원하고 XX.0과 같은 것들에도 작동합니다! Math.floor ()는 소수가 있으면 소수점을 자르기 때문에 바닥이 원래 숫자와 다르면 소수임을 알 수 있습니다! 그리고 문자열 변환은 없습니다 :)


4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);

4
에 실패합니다 num= 999999999999999999999.
bobince 2019

1
먼저 문자열로 변환 한 다음 re를 수행하십시오.
ghostdog74

문자열로 변환하지 않고 나를 위해 일했습니다.
Abe Petrillo

4

Number.isInteger()아마도 가장 간결 할 것입니다. 정수이면 true를 반환하고 그렇지 않으면 false를 반환합니다.


1
문자열 문제로 인해 계수를 사용하는 것보다 낫기 때문에 이것이 정답입니다.
Ini

3
function isDecimal(n){
    if(n == "")
        return false;

    var strCheck = "0123456789";
    var i;

    for(i in n){
        if(strCheck.indexOf(n[i]) == -1)
            return false;
    }
    return true;
}

설명이 필요 없습니다. 꽤 간단합니다.
Grant Birchmeier

1
문자열에 strCheck의 값이 포함되어 있으면 10 진수입니다 ... (그리고 그는 빠졌습니다 ...
NicoJuicy

2
parseInt(num) === num

숫자를 전달 parseInt()하면 숫자를 int로 반환합니다.

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

4
나는 이것을 많이 좋아하지만 특정 요구에 달려 있습니다. 불행히도, 테스트를 실패시키는 기능이 필요합니다parseInt(3.0) === 3.0 // true
zipzit

2

숫자 문자열을 배열로 변환하고 소수점으로 나눕니다. 그런 다음 배열에 값이 하나만 있으면 문자열에 소수점이 없음을 의미합니다.

if(!number.split(".")[1]){
    //do stuff
}

이 방법으로 정수와 소수가 실제로 무엇인지 알 수 있습니다. 더 진보 된 예가 될 것입니다.

number_to_array = string.split(".");
inte = number_to_array[0];
dece = number_to_array[1]; 

if(!dece){
    //do stuff
}

1

다음은 가드 라이브러리에서 발췌 한 내용입니다 (David Herman의 Effective JavaScript에서 영감을 얻음).

var guard = {

    guard: function(x) {
        if (!this.test(x)) {
            throw new TypeError("expected " + this);
        }
    }

    // ...
};

// ...

var number = Object.create(guard);
number.test = function(x) {
    return typeof x === "number" || x instanceof Number;
};
number.toString = function() {
    return "number";
};


var uint32 = Object.create(guard);
uint32.test = function(x) {
    return typeof x === "number" && x === (x >>> 0);
};
uint32.toString = function() {
    return "uint32";
};


var decimal = Object.create(guard);
decimal.test = function(x) {
    return number.test(x) && !uint32.test(x);
};
decimal.toString = function() {
    return "decimal";
};


uint32.guard(1234);     // fine
uint32.guard(123.4);    // TypeError: expected uint32

decimal.guard(1234);    // TypeError: expected decimal
decimal.guard(123.4);   // fine

1

당신은 수 (10)에 의해 곱 후 "할 모듈 "작업 / divison를 10으로 , 그 두 작업의 결과가 0인지 확인. 이 두 연산의 결과는 소수점 다음에 첫 번째 숫자 를 제공합니다 . 결과가 0이면 숫자는 정수입니다.

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}


1

값 ( ^ 0또는 ~~)을 변경하지 않는 비트 단위 연산을 사용하여 반올림에 사용할 수있는 소수 부분을 버릴 수 있습니다. 숫자를 반올림 한 후 원래 값과 비교됩니다.

function isDecimal(num) {
  return (num ^ 0) !== num;
}

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true


1

다음 함수를 사용하여 숫자에 소수점 이하 자릿수가 있는지 확인할 수 있습니다.

function hasDecimal(num){
    return !!(num % 1);
}

console.log(hasDecimal(2)); //false
console.log(hasDecimal(2.32423)); //true

따라서 일부 사용자는 설명을 원합니다. 조각으로 나눕니다 : (num % 1)

괄호는 해당 작업을 먼저 수행하는 것을 의미합니다. num-함수가 전달한 변수 %-왼쪽 숫자를 오른쪽으로 나누려고하는 계수 기호. 나머지가 있으면 소수로 반환합니다. 균등하게 나누면 0을 반환합니다.

따라서 지금까지 가지고있는 것을 요약하면 (num % 1)은 다음을 반환합니다.

균등하게 나눈 경우 0 또는 그렇지 않은 경우 #. #####

0 == 거짓.

[ANY_NUMBER_NOT_ZERO] == true.

예 : new Boolean (0)이 false 인 경우 new Boolean (12312.1231)이 true 인 경우

다른 대안 : 사용자가 (num % 1)의 값을 반환하려고 시도했을 수 있습니다. 기본적으로 동일한 결과를 얻을 수 있습니다. 리턴 (0)이 false이고 리턴 (1.213113)이 true이므로

그러나 부울 값을 반환하고 싶었습니다. 따라서 부울에 값을 강제로 넣는 바로 가기로! 그 전에 기호.

알고있는만큼.,! NOT을 의미합니다. 그러나 또한 값을 부울로 강제합니다.

이후! symobol은 값을 부울로 강제하고 그 값을 반대로합니다. 나는 사용한다 !! 값을 부울로 강제하고 값을 원래 부울 값으로 되돌립니다.

여기에 이미지 설명을 입력하십시오


이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Nic3500

0

확인 번호 기능은 10 진수 또는 정수입니다.

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

    if (p_decimalNumber % 1 == 0)
        l_boolIsExist = false;

    return l_boolIsExist;
}

0

아마도 이것이 당신을 위해 작동합니까?

정규식을 사용하여 숫자에 쉼표가 있는지 확인하고 없으면 쉼표와 스트라이프를 추가합니다.

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);

StackOverflow에 오신 것을 환영합니다. 이 코드의 기능과 문제를 해결할 것이라고 생각하는 이유를 자세히 설명해 주시겠습니까?
quinz 2016

@quinz 정규식을 사용하여 숫자에 쉼표가 있는지 확인하고 없으면 쉼표와 스트라이프를 추가합니다. 따라서 둥근 가격표의 서식을 추가하는 기능이 추가되어 질문에서 요구하는 사항을 수행합니다.
user11608734

0

값이 문자열 인 경우 다음을 사용하십시오 (예 : from <input) :

Math.floor(value).toString() !== value

.toString()바닥에 추가 하여 value == "1."(소수 구분 기호 또는 다른 문자열로 끝나는) 경우에도 작동하도록합니다 . 또한 Math.floor항상 일부 값을 반환하므로 .toString()절대 실패하지 않습니다.

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