HOWTO · JavaScript
JavaScript에서 부동 소수점 수를 정수로 변환하는 방법
JavaScript Number를 버림하거나 반올림하고 10진수 텍스트를 분석하며 안전하지 않은 비트 단축 표현을 피하는 방법을 알아봅니다.
이 페이지의 내용
JavaScript에는 별도의 int와 float 타입이 없으며, 둘 다 보통 Number 타입으로 표현됩니다. 기존 숫자 값에서 소수 부분을 제거하려면 0을 향해 버림하는 Math.trunc()를 사용합니다. 이를 0 방향 절삭이라고 합니다.
console.log(Math.trunc(12.75));
console.log(Math.trunc(-12.75));
출력:
12
-12
적절한 메서드는 원하는 결과에 따라 달라집니다.
- 소수 부분을 0 방향으로 버리려면
Math.trunc(value)를 사용합니다. - 반올림 방향이 중요하면
Math.floor(value)또는Math.ceil(value)를 사용합니다. - 가장 가까운 정수를 선택하려면
Math.round(value)를 사용합니다. - 입력이 10진수 텍스트일 때는
parseInt(text, 10)을 사용하며,Number절삭의 기본 방법으로 쓰지는 않습니다.
Math.trunc()으로 숫자 절삭하기
Math.trunc()은 반올림하지 않고 숫자의 정수 부분을 반환합니다. 양수에서는 소수점 뒤를 모두 제거하고, 음수에서는 0에 가까워지므로 -12.75는 -13이 아니라 -12가 됩니다.
const value = -12.75;
console.log(Math.trunc(12.75));
console.log(Math.trunc(value));
출력:
12
-12
값이 이미 숫자이고 정수 부분만 유지하려는 경우 일반적으로 가장 명확한 선택입니다. -1과 0 사이의 값은 음의 0을 만들 수 있습니다.
console.log(Object.is(Math.trunc(-0.5), -0));
출력:
true
애플리케이션에서 -0과 0을 구분해야 한다면 이 경우를 명시적으로 처리하세요.
반올림에는 floor(), ceil(), round() 선택하기
절삭과 반올림은 서로 다른 연산입니다. Math.floor()는 값 이하의 가장 큰 정수를, Math.ceil()은 값 이상의 가장 작은 정수를 반환합니다. 이 차이는 음수에서 특히 중요합니다.
const value = -12.75;
console.log(Math.floor(value));
console.log(Math.ceil(value));
console.log(Math.round(-1.5));
출력:
-13
-12
-1
하한에는 Math.floor(), 상한에는 Math.ceil(), 가장 가까운 정수에는 Math.round()를 사용하세요. JavaScript의 Math.round()는 동률일 때 양의 무한대 방향으로 처리하므로 Math.round(-1.5)는 -1을 반환합니다.
parseInt()로 10진수 텍스트 분석하기
원본이 문자열이면 parseInt()로 정수 접두사를 분석할 수 있습니다. 10진수 텍스트에는 기수로 10을 전달하세요.
console.log(parseInt("12.75", 10));
console.log(Number.isNaN(parseInt("not a number", 10)));
출력:
12
true
parseInt()는 분석 규칙을 따르므로 기수에 유효하지 않은 문자를 만나면 멈출 수 있습니다. 따라서 기존 숫자의 절삭과는 다릅니다. 입력을 먼저 숫자로 변환하고 전체를 검증해야 한다면 Math.trunc(Number("12.75"))가 적합합니다. 잘못된 입력이 가능하면 Number.isNaN() 등으로 검증하세요.
일반 변환에서 toFixed()와 비트 연산 단축형 피하기
Number.toFixed()는 서식 지정 메서드입니다. 지정한 소수 자릿수로 반올림한 문자열을 반환하므로 일반적인 정수 변환 메서드가 아닙니다.
console.log(typeof (12.75).toFixed(0));
출력:
string
value | 0, ~~value, value >> 0 같은 비트 연산도 0 방향으로 절삭하지만 먼저 값을 부호 있는 32비트 정수로 변환합니다. 범위를 벗어난 값은 순환할 수 있습니다.
console.log(2 ** 31 | 0);
출력:
-2147483648
이 표현식은 의도적으로 부호 있는 Int32 강제 변환이 필요할 때만 사용하세요. Math.trunc()보다 안전하거나 명확한 대체 방법이 아닙니다.
기억해야 할 제한 사항
Number는 IEEE 754 배정밀도 부동 소수점 표현을 사용합니다. 정수는 Number.MAX_SAFE_INTEGER와 Number.MIN_SAFE_INTEGER 범위에서만 정확하게 표현됩니다. 정확한 정수 연산이 중요하면 Number.isSafeInteger()를 사용하고 유한하지 않은 값도 명시적으로 처리하세요.
console.log(Math.trunc(Infinity));
console.log(Math.trunc(NaN));
출력:
Infinity
NaN
Math.trunc()는 Infinity, -Infinity, NaN을 유한한 정수로 만들지 않습니다. 유한하고 안전한 정수가 필요하면 입력을 검증하세요.
요약
기존 JavaScript 숫자에서 소수 부분을 0 방향으로 제거한 값을 “정수”로 볼 때는 Math.trunc(value)부터 사용하세요. 특정 반올림 규칙이 필요하면 Math.floor(), Math.ceil(), Math.round() 중에서 선택합니다. 10진수 텍스트에는 parseInt(text, 10)을 쓰고, toFixed()가 서식 있는 텍스트를 반환한다는 점과 비트 연산은 부호 있는 32비트 변환을 의도할 때만 사용해야 한다는 점을 기억하세요.