JavaScript에서 부동 수를 정수로 변환하려면 어떻게합니까?


1108

JavaScript에서 float를 정수로 변환하고 싶습니다. 실제로, 나는 표준 변환의 두 가지를 수행하는 방법을 알고 싶습니다 : 잘림과 반올림. 효율적으로 문자열로 변환하고 파싱하지 않습니다.


83
당신이 그것을 모른다면, 자바 스크립트의 모든 숫자는 부동입니다. 사양에서 :

6
4.3.20 숫자 유형 : 숫자 유형은 숫자를 나타내는 값 집합입니다. ECMAScript에서 값 세트는 특수 "숫자"(NaN) 값, 양의 무한대 및 음의 무한대를 포함한 배정도 64 비트 형식 IEEE 754 값을 나타냅니다.

9
예, Javascript에는 고유 한 "정수"유형이 없지만이 변환을 수행해야하는 경우는 드물지 않습니다. 예를 들어, 내 응용 프로그램에서 사용자는 숫자를 입력했을 수 있습니다 (아마도 센트 포함). 나는 센트를 자르고 쉼표로 표시해야했습니다. 1 단계는 int로 변환하는 것이 었습니다.
mcherm

1
또한 유용한 : 모든 방법의 속도 비교 jsperf.com/math-floor-vs-math-round-vs-parseint/33
c ..

1
@karl : 필드에 입력을 수락하면 허용되는 문자를 제어 할 수는 있지만 사용자 입력을 수락하는 것이 아니라 Javascript로 모든 종류의 처리를 수행 할 수 있습니다. 심지어 붙여 넣기 지원과 같은 것들을 원할 수도 있습니다.
mcherm

답변:


1608
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue ); 
var intvalue = Math.round( floatvalue );

// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );

수학 객체 참조


// value=x        //  x=5          5<x<5.5      5.5<=x<6  

Math.floor(value) //  5            5            5
Math.ceil(value)  //  5            6            6
Math.round(value) //  5            5            6
Math.trunc(value) //  5            5            5
parseInt(value)   //  5            5            5
~~value           //  5            5            5
value | 0         //  5            5            5
value >> 0        //  5            5            5
value >>> 0       //  5            5            5
value - value % 1 //  5            5            5
부정
// value=x        // x=-5         -5>x>=-5.5   -5.5>x>-6

Math.floor(value) // -5           -6           -6
Math.ceil(value)  // -5           -5           -5
Math.round(value) // -5           -5           -6
Math.trunc(value) // -5           -5           -5
parseInt(value)   // -5           -5           -5
value | 0         // -5           -5           -5
~~value           // -5           -5           -5
value >> 0        // -5           -5           -5
value >>> 0       // 4294967291   4294967291   4294967291
value - value % 1 // -5           -5           -5
양수-큰 숫자
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1

// value=x            x=900719925474099    x=900719925474099.4  x=900719925474099.5

Math.floor(value) //  900719925474099      900719925474099      900719925474099
Math.ceil(value)  //  900719925474099      900719925474100      900719925474100
Math.round(value) //  900719925474099      900719925474099      900719925474100
Math.trunc(value) //  900719925474099      900719925474099      900719925474099
parseInt(value)   //  900719925474099      900719925474099      900719925474099
value | 0         //  858993459            858993459            858993459
~~value           //  858993459            858993459            858993459
value >> 0        //  858993459            858993459            858993459
value >>> 0       //  858993459            858993459            858993459
value - value % 1 //  900719925474099      900719925474099      900719925474099
음수-큰 숫자
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1

// value = x      // x=-900719925474099   x=-900719925474099.5 x=-900719925474099.6

Math.floor(value) // -900719925474099     -900719925474100     -900719925474100
Math.ceil(value)  // -900719925474099     -900719925474099     -900719925474099
Math.round(value) // -900719925474099     -900719925474099     -900719925474100
Math.trunc(value) // -900719925474099     -900719925474099     -900719925474099
parseInt(value)   // -900719925474099     -900719925474099     -900719925474099
value | 0         // -858993459           -858993459           -858993459
~~value           // -858993459           -858993459           -858993459
value >> 0        // -858993459           -858993459           -858993459
value >>> 0       //  3435973837           3435973837           3435973837
value - value % 1 // -900719925474099     -900719925474099     -900719925474099

82
다른 답변에서 언급했듯이 음의 안전 자르기는을 사용하여 수행 할 수 있습니다 var intValue = ~~floatValue;. 표기법이 취향에 맞지 않으면, 함수에 숨기십시오 : function toInt(value) { return ~~value; }. (이렇게하면 문자열을 정수로 변환 할 수도 있습니다.)
Keen

4
이 답변에 예제 입력 / 출력이 있으면 투표하십시오.
J. 랜덤 코더

7
주석과 관련하여 ~~는 32 비트 부호있는 정수로 값을 제한하는 반면 Math.floor / ceil / round는 최대 53 비트 (Number.MAX_SAFE_INTEGER 9007199254740991)를 처리 할 수 ​​있습니다. 이것은 아래 답변에 언급되어 있지만이 의견을 읽는 사람들에게는 여기서 반복 할 가치가 있습니다.
John

2
여러 곳에서 아래에서 읽으십시오 : Math.trunc(val);이것은 답변이 수락 되었기 때문에 의견을
Old Badman Grey

같은 값에 대한 정확한 정밀하게 작동하지 않습니다2.3 - 2.3 % 1
Lapys

301

비트 OR 연산자

비트 또는 연산자를 사용하여 부동 소수점 숫자를자를 수 있으며 양수뿐만 아니라 양수에도 사용할 수 있습니다.

function float2int (value) {
    return value | 0;
}

결과

float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3

성능 비교?

다음 과 같은 성능을 비교 하는 JSPerf 테스트 를 만들었습니다 .

  • Math.floor(val)
  • val | 0 비트 OR
  • ~~val 비트 NOT
  • parseInt(val)

그것은 양수로만 작동합니다. 이 경우 비트 연산을 Math.floor함수 로 사용하는 것이 안전 합니다.

그러나 positive뿐만 아니라 negatives와 함께 작업 하기 위해 코드가 필요한 경우 비트 연산이 가장 빠릅니다 (또는 선호되는 작업). 이 다른 JSPerf 테스트 는 추가 부호 확인으로 인해 Math가 이제 4 개 중 가장 느리다는 것이 명백한 부분에서 동일하게 비교 됩니다.

노트

주석에서 언급했듯이 BITWISE 연산자는 부호있는 32 비트 정수로 작동하므로 다음과 같이 큰 숫자가 변환됩니다.

1234567890  | 0 => 1234567890
12345678901 | 0 => -539222987

@ FabioPoloni : 예 매우 간단하며 비트 연산자가 가장 빠릅니다. 특히 OR 연산자는 NOT 및 Math 연산과 일치하는 경우가 가장 빠르지 만, 숫자 부호를 추가로 확인하기 때문에 음수도 지원해야 할 때 Math 연산이 가장 느립니다.
Robert Koritnik

9
@thefourtheye : 부호없는 오른쪽 시프트를 제외한 모든 비트 연산은 부호있는 32 비트 정수에서 작동합니다. 따라서 부동 소수점 값에 비트 단위 연산을 사용하면 소수점 뒤의 숫자를 정수로 제거합니다.
Robert Koritnik

3
양수를 위해 필요하다면 Math.floor()(최소한 Chrome에서 첫 번째 JSPerf 테스트 버전 30.0.1599.101을 실행 한 결과) 더 빠르며 (숫자가 비트로 표현되는 방식에 의존하지 않기 때문에) 이 비트 솔루션을 변경하고 깨뜨릴 수 있습니다), 가장 중요한 것은 더 명확합니다.
ma11hew28

8
비트 연산자는 32 비트 숫자에서 작동합니다. 32 비트에 맞지 않는 숫자는 작동하지 않습니다.
Kat

2
~~단항 연산자이기 때문에 더 좋습니다. 4.2|0+4동일 4하지만 ~~4.2+4동일8
야누스 Troelsen

94

참고 : Math.floor()잘라내기를 대신 할 수는 Math.floor(-3.1) = -4없습니다 -3.

잘림을 대체하는 올바른 방법은 다음과 같습니다.

function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}

1
음수에 대한 원하는 동작에 따라 다릅니다. 더 큰 음수 값 (-3.5-> -4)에 매핑하려면 음수가 필요하고 일부는 더 작은 정수 (-3.5-> -3)에 매핑해야합니다. 전자는 일반적으로 "바닥"이라고합니다. "잘라 내기"라는 단어는 종종 두 동작을 설명하는 데 사용됩니다. 제 경우에는 음수 만 먹이려고했습니다. 그러나이 의견은 음수 행동을 걱정하는 사람들에게 유용한 경고입니다.
mcherm

28
@ mcherm : 그렇다면 그들은 "잘라 내기"라는 용어를 올바르게 이해하지 못하는 것 같습니다. 자르기는 이름에서 알 수 있듯이 정확하게 숫자를 자릅니다. 일반적으로 바닥이나 천장에 해당하는 것은 아닙니다. en.wikipedia.org/wiki/
잘라

5
Math.trunc(value)6 ECMAScript를 첨가 하였다
4esn0k

2
floor-무한쪽으로 truncate반올림하고 0으로 반올림합니다. ( ceil+ 무한대로 반올림).
Peter Cordes

46

부동 비트 를 자르는 데 비트를 두 번 사용 하지 않는 연산자를 사용할 수 있습니다. 당신이 언급 한 다른 작업이 가능 통해 수 있습니다 Math.floor, Math.ceil그리고 Math.round.

> ~~2.5
2
> ~~(-1.4)
-1

자세한 내용은 James Padolsey가 제공합니다.


1
이것은 아마도 (이 모호한 이후) 생산 코드를 할 수있는 나쁜 일이지만 나는 코드 - 골프에 필요한 정확하게이었다 <canvas>JS에서 글꼴 렌더링 엔진을 . 감사합니다!
Kragen Javier Sitaker

10
이것은 n | 0.
Jay Douglass

17
두 가지 방법 (~~ n 또는 n | 0)은 최대 2 ^ 31-1 또는 2147483647의 숫자에서만 작동합니다. 2147483648 이상은 잘못된 결과를 반환합니다. 예를 들어, 2147483647 | 0은 -2147483648을 반환하고 4294967295 | 0은 -1을 반환합니다. 이는 거의 확실히 원하는 것이 아닙니다.
Ed Bayiates

40

자르기 :

var intvalue = Math.floor(value);

라운드 :

var intvalue = Math.round(value);

6
Math.floor는 음수 값을 자르지 않습니다. 위의 답변을 참조하십시오. 그렇지 않으면 좋은 대답입니다.
oligofren

성능에 관심이 있다면 jsperf.com/dsafdgdfsaf/2(var | 0이 여기에 있음) 라는 작은 테스트 사례를 여기에 넣었습니다 .
Cybolic

25

반올림없이 parseInt 메소드를 사용할 수 있습니다 . 0x (16 진수) 및 0 (8 진수) 접두사 옵션으로 인해 사용자 입력에주의하십시오.

var intValue = parseInt(floatValue, 10);

1
이것은 반올림 또는 내림없이 소수의 정수 부분을 원할 때 실제로 유용합니다.
유다 가브리엘 히 망고

1
... 단순히 잘라내는 경우에도 가장 느린 방법 인 것 같습니다. jsperf.com/float-to-int-conversion-comparison
Robert Koritnik

2
기대하는 기준을 지정하려면 항상 두 번째 값을 parseInt에 전달하십시오. 따라서에서는 parseInt (하는 FloatValue, 10)는 항상 기본 10 얻을
팀 Tisdall

3
이것은 오래되었지만이 질문은 자주 묻는 질문 인 것 같습니다.이 경고를 여기에 넣겠습니다. 크기 때문에 "e"표기법을 사용하여 값을 표시하면 예상 한 숫자가 아닌 한 자릿수 만 표시됩니다. 예를 들어, parseInt(1000000000000000000000, 10);1이 아닌 000 000 000 000 000 000 000 어쨌든, 문제는 명시 적으로 "싶지 않았다 한 결과, 문자열로 변환과 해석을 그 ... 비교적 작은 비록")
94 헤비 콴타스

4
@ Qantas94Heavy이 동작의 이유 parseInt()문자열 이 숫자가 아닌 첫 번째 매개 변수 이기 때문 입니다. 이 정수를 전달하면 정수로 변환 된 1e21다음 parseInt문자열 을 구문 분석하여 1e21결과가됩니다 1.
올라프 Dietsche

18

0으로의 비트 시프트는 1로 나누는 것과 같습니다.

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2

4
작은 참고 : >> 0정수 < 2 ^ 31-1>>> 0정수 < 2 ^ 32-1 에서만 작동하는 것 같습니다 . 더 큰 값의 경우 0을 반환합니다.
Romuald Brunet

@RomualdBrunet, 예, JavaScript는 모든 비트 단위 연산을 32 비트 숫자로 작동하는 것으로 명확하게 정의합니다. 그것은 사양에 있습니다.
Alexis Wilke

이것은 자바 스크립트가 위의 답변에 명시된 32 비트 (부호있는) 정수로 비트 단위 연산을 수행하므로 작동합니다. 따라서 아무것도하지 않는 것처럼 보이는 비트 연산 (0, OR을 0으로, AND를 1, 이중 NOT으로 이동)과 같이 값을 32 비트 int로 변환하려면 Javascript 인터프리터가 필요합니다.
FrankKrumnow


7

여기에는 많은 제안이 있습니다. 비트 OR은 가장 간단한 것으로 보입니다. 다음은 모듈로 연산자를 사용하여 음수로 작동하는 또 다른 간단한 솔루션입니다. 비트 OR보다 이해하기가 더 쉽습니다.

intval = floatval - floatval%1;

이 방법은 또한 '| 0'또는 '~~'또는 '>> 0'이 올바르게 작동하지 않는 높은 값의 숫자에서도 작동합니다.

> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295

다른 답변을 참조하는 경우 이에 대한 참조를 추가하거나 아이디어를 간략하게 스케치하십시오.
bertl

5

자르 려면 :

// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 );  // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted

라운드 :

Math.round( 1.5 );  // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1

5

한 가지 더 가능한 방법 — XOR 연산을 사용하십시오.

console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2

비트 연산의 우선 순위는 수학 연산의 우선 순위보다 낮으며, 유용합니다. https://jsfiddle.net/au51uj3r/에서 시도 하십시오.


2

MathJavaScript에서 네이티브 객체를 살펴보면 숫자와 값 등을 다루는 함수가 많이 있습니다.

기본적으로 당신이하고 싶은 것은 JavaScript에서 매우 간단하고 기본입니다 ...

아래에 숫자가 있다고 상상해보십시오.

const myValue = 56.4534931;

이제 가장 가까운 숫자로 반올림하려면 간단히 다음을 수행하십시오.

const rounded = Math.floor(myValue);

그리고 당신은 얻을 :

56

가장 가까운 숫자로 반올림하려면 다음을 수행하십시오.

const roundedUp = Math.ceil(myValue);

그리고 당신은 얻을 :

57

또한 Math.round플로트 수에 가까운 것에 따라 더 높거나 낮은 수로 반올림합니다.

또한 ~~부동 소수점 뒤를 사용 하면 부동 소수점을 정수로 변환 할 수 있습니다.

당신은 그것을처럼 사용할 수 있습니다 ~~myValue...


조심 Plase ~~수가 INT 32 한도보다 큰 경우는 INT 32 제한값 값을 변경하기 때문에.
Machado

1

//Convert a float to integer

Math.floor(5.95)
//5

Math.ceil(5.95)
//6

Math.round(5.4)
//5

Math.round(5.5)
//6

Math.trunc(5.5)
//5

//Quick Ways
console.log(5.95| 0)
console.log(~~5.95) 
console.log(5.95 >> 0)
//5


0

나는 화폐 적으로 당신이 둥글게하지 말고 둥글게하고 싶다는 것을 지적하고 싶습니다. 4.999452 * 100 반올림하면 5가 더 대표적 답변이므로 1 페니로 내릴 가능성은 훨씬 적습니다.

그리고 은행의 반올림을 잊지 마십시오 . 이는 반올림이 제공하는 약간의 긍정적 인 편견을 극복하는 방법입니다. 재무 응용 프로그램에 필요할 수 있습니다.

JavaScript에서 가우시안 / 뱅커의 반올림


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