숫자를 올림, 내림 또는 반올림하는 방법
다양한 반올림 모드를 사용하여 형식을 지정할 때 JavaScript가 소수를 반올림하는 방법 제어
소개
표시할 숫자의 형식을 지정할 때 소수 값을 반올림해야 하는 경우가 많습니다. $2.567의 가격은 $2.57이 되어야 합니다. 3.891미터의 측정값은 4미터로 표시될 수 있습니다. 이러한 숫자를 반올림하는 방식은 정확도, 사용자 기대치 및 비즈니스 로직에 영향을 미칩니다.
상황에 따라 다른 반올림 전략이 필요합니다. 때로는 제품에 대해 충분한 금액을 청구하기 위해 올림해야 합니다. 때로는 예산 내에서 유지하기 위해 내림해야 합니다. 대부분의 경우 정확도를 유지하기 위해 가장 가까운 값으로 반올림합니다.
JavaScript는 Intl.NumberFormat API를 통해 9가지 반올림 모드를 제공합니다. 이러한 모드는 숫자가 두 가능한 값 사이에 있을 때 반올림되는 방식을 제어합니다. 이 레슨에서는 가장 일반적인 세 가지 반올림 모드를 설명하고 다른 모드를 사용해야 하는 경우를 보여줍니다.
JavaScript가 기본적으로 숫자를 반올림하는 방법
반올림 모드를 지정하지 않고 숫자의 형식을 지정하면 JavaScript는 halfExpand라는 전략을 사용합니다. 이 모드는 값을 가장 가까운 값으로 반올림하며, 숫자가 두 값의 정확히 중간에 있을 때는 0에서 멀어지는 방향으로 반올림합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0
});
console.log(formatter.format(2.4));
// Output: "2"
console.log(formatter.format(2.5));
// Output: "3"
console.log(formatter.format(2.6));
// Output: "3"
값 2.4는 3보다 2에 더 가까우므로 2로 내림됩니다. 값 2.6은 2보다 3에 더 가까우므로 3으로 올림됩니다. 값 2.5는 2와 3의 정확히 중간에 위치하므로 halfExpand 모드는 0에서 멀어지는 방향인 3으로 반올림합니다.
이 기본 동작은 대부분의 사람들이 학교에서 배우고 일상적인 계산에서 기대하는 것과 일치합니다. 많은 계산에서 반올림 오류를 균등하게 분산시켜 범용 숫자 형식 지정에 적합합니다.
0에서 멀어지는 방향의 의미 이해하기
"0에서 멀어지는 방향"이라는 표현은 두 가능한 값의 정확히 중간에 위치한 숫자의 반올림 방향을 설명합니다. 양수의 경우 0에서 멀어지는 방향으로 반올림한다는 것은 올림을 의미합니다. 음수의 경우 0에서 멀어지는 방향으로 반올림한다는 것은 더 큰 크기로 내림하는 것을 의미합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0
});
console.log(formatter.format(2.5));
// Output: "3"
console.log(formatter.format(-2.5));
// Output: "-3"
2.5와 -2.5 모두 0에서 멀어지는 방향으로 반올림됩니다. 2.5의 경우 0에서 멀어지는 방향은 양의 무한대 방향을 의미하여 3이 됩니다. -2.5의 경우 0에서 멀어지는 방향은 음의 무한대 방향을 의미하여 -3이 됩니다. 두 경우 모두 크기가 증가합니다.
ceil을 사용한 올림
ceil 반올림 모드는 항상 양의 무한대 방향으로 반올림합니다. 양수의 경우 올림을 의미하고, 음수의 경우 0 방향으로 반올림하는 것을 의미합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "ceil"
});
console.log(formatter.format(2.1));
// Output: "3"
console.log(formatter.format(2.9));
// Output: "3"
console.log(formatter.format(-2.1));
// Output: "-2"
console.log(formatter.format(-2.9));
// Output: "-2"
이 모드는 숫자가 필요한 것보다 작아지지 않도록 보장해야 할 때 유용합니다. 예를 들어 상자 하나에 2.3개의 물건을 담을 수 있다고 계산하면 3개의 상자가 필요합니다. 작업에 1.1일이 걸린다고 계산하면 2일을 계획해야 합니다.
const boxFormatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "ceil"
});
const itemsPerBox = 5;
const totalItems = 12;
const boxesNeeded = totalItems / itemsPerBox;
console.log(boxFormatter.format(boxesNeeded));
// Output: "3"
계산 결과는 2.4개의 상자이지만 상자의 일부를 주문할 수는 없습니다. 올림을 사용하면 충분한 용량을 확보할 수 있습니다.
floor를 사용한 내림
floor 반올림 모드는 항상 음의 무한대 방향으로 반올림합니다. 양수의 경우 내림을 의미하고, 음수의 경우 0에서 멀어지는 방향으로 반올림하는 것을 의미합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "floor"
});
console.log(formatter.format(2.1));
// Output: "2"
console.log(formatter.format(2.9));
// Output: "2"
console.log(formatter.format(-2.1));
// Output: "-3"
console.log(formatter.format(-2.9));
// Output: "-3"
이 모드는 보수적인 추정이 필요하거나 한도 내에 머물고자 할 때 유용합니다. 예를 들어 $100.87의 예산이 있는 경우 실수로 초과 지출하지 않도록 $100로 표시할 수 있습니다.
const budgetFormatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
maximumFractionDigits: 0,
roundingMode: "floor"
});
const availableBudget = 100.87;
console.log(budgetFormatter.format(availableBudget));
// Output: "$100"
내림을 사용하면 표시된 금액이 항상 실제 예산으로 달성 가능하도록 보장됩니다.
가장 가까운 값으로 반올림하기 (halfExpand)
halfExpand가 기본값이지만, 코드에서 의도를 명확히 하기 위해 명시적으로 지정할 수 있습니다. 이 모드는 가장 가까운 값으로 반올림하며, 중간값의 경우 0에서 멀어지는 방향으로 반올림합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 1,
roundingMode: "halfExpand"
});
console.log(formatter.format(2.14));
// Output: "2.1"
console.log(formatter.format(2.15));
// Output: "2.2"
console.log(formatter.format(2.16));
// Output: "2.2"
값 2.14는 2.1에 더 가까우므로 2.1로 반올림됩니다. 값 2.16은 2.2에 더 가까우므로 2.2로 반올림됩니다. 값 2.15는 정확히 중간에 위치하므로 0에서 멀어지는 방향인 2.2로 반올림됩니다.
이 모드는 많은 계산에서 전체 반올림 오차를 최소화하기 때문에 대부분의 숫자 형식 지정 작업에 적합합니다. 각 중간값은 0의 양수 또는 음수 쪽에 있을 확률이 동일하므로, 시간이 지남에 따라 반올림 방향이 균형을 이룹니다.
반올림 모드와 소수 자릿수 결합하기
반올림 모드는 소수 자릿수 설정과 함께 작동하여 최종 출력을 제어합니다. maximumFractionDigits 옵션은 표시할 소수 자릿수를 결정하고, roundingMode는 표현 가능한 숫자 사이에 있는 값을 처리하는 방법을 결정합니다.
const ceilFormatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
roundingMode: "ceil"
});
console.log(ceilFormatter.format(10.001));
// Output: "$10.01"
console.log(ceilFormatter.format(10.999));
// Output: "$11.00"
소수점 두 자리로 표현할 때, 10.001은 10.00 또는 10.01로 반올림되어야 합니다. ceil 모드는 올림하여 10.01을 생성합니다. 값 10.999는 11.00으로 올림됩니다.
0 방향으로 반올림하기 (trunc)
trunc 반올림 모드는 0 방향으로 반올림하며, 이는 숫자의 소수 부분을 제거함을 의미합니다. 양수의 경우 내림이 되고, 음수의 경우 올림이 됩니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "trunc"
});
console.log(formatter.format(2.1));
// Output: "2"
console.log(formatter.format(2.9));
// Output: "2"
console.log(formatter.format(-2.1));
// Output: "-2"
console.log(formatter.format(-2.9));
// Output: "-2"
이 모드는 소수 부분을 효과적으로 절삭합니다. 반올림 목적으로 소수 값을 고려하지 않고 숫자의 정수 부분만 표시하려는 경우에 유용합니다.
expand를 사용한 0에서 멀어지는 방향으로 반올림
expand 반올림 모드는 0에서 멀어지는 방향으로 반올림합니다. 양수의 경우 올림이 되고, 음수의 경우 더 큰 크기로 내림이 됩니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "expand"
});
console.log(formatter.format(2.1));
// Output: "3"
console.log(formatter.format(2.9));
// Output: "3"
console.log(formatter.format(-2.1));
// Output: "-3"
console.log(formatter.format(-2.9));
// Output: "-3"
이 모드는 반올림이 항상 숫자의 크기를 증가시키도록 보장합니다. 과소평가보다 정확성을 우선하는 방향으로 보수적으로 처리하고자 하는 금융 상황에서 유용할 수 있습니다.
중간값 반올림 모드 이해하기
half로 시작하는 다섯 가지 모드는 모두 가장 가까운 값으로 반올림하지만, 정확히 중간값인 경우를 처리하는 방식이 다릅니다. 이러한 모드는 값이 표현 가능한 두 숫자 사이에 정확히 위치할 때 동점 처리 동작을 세밀하게 제어할 수 있게 해줍니다.
halfCeil 모드는 중간값을 양의 무한대 방향으로 반올림합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfCeil"
});
console.log(formatter.format(2.5));
// Output: "3"
console.log(formatter.format(-2.5));
// Output: "-2"
halfFloor 모드는 중간값을 음의 무한대 방향으로 반올림합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfFloor"
});
console.log(formatter.format(2.5));
// Output: "2"
console.log(formatter.format(-2.5));
// Output: "-3"
halfTrunc 모드는 중간값을 0 방향으로 반올림합니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfTrunc"
});
console.log(formatter.format(2.5));
// Output: "2"
console.log(formatter.format(-2.5));
// Output: "-2"
halfEven 모드는 중간값을 가장 가까운 짝수로 반올림합니다. 이 모드는 금융 계산에서 편향을 줄이기 때문에 은행가 반올림이라고도 불립니다.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfEven"
});
console.log(formatter.format(2.5));
// Output: "2"
console.log(formatter.format(3.5));
// Output: "4"
console.log(formatter.format(4.5));
// Output: "4"
2.5는 2가 짝수이므로 2로 반올림됩니다. 3.5는 4가 짝수이므로 4로 반올림됩니다. 4.5도 4가 짝수이므로 4로 반올림됩니다.
애플리케이션에 적합한 반올림 모드 선택하기
선택하는 반올림 모드는 비즈니스 요구사항과 표시하는 데이터의 특성에 따라 달라집니다. 상황에 따라 다른 전략이 필요합니다.
충분성을 보장해야 할 때는 ceil를 사용하세요. 용량 계획, 재고 수량, 시간 추정은 적절한 리소스를 보장하기 위해 올림이 필요한 경우가 많습니다.
제한 내에 머물러야 할 때는 floor를 사용하세요. 예산 표시, 할당량 추적, 할인 계산은 사용 가능한 리소스를 초과하지 않도록 내림이 필요한 경우가 많습니다.
정확성이 중요하지만 극도의 정밀도가 필수적이지 않은 일반적인 표시 목적에는 halfExpand를 사용하세요. 이것이 기본값인 데는 이유가 있으며 대부분의 숫자 형식 지정 작업에 잘 작동합니다.
누적 반올림 편향을 최소화해야 하는 금융 계산에는 halfEven를 사용하세요. 이 모드는 많은 계산에 걸쳐 반올림 오류가 한 방향으로 일관되게 치우치지 않도록 보장합니다.
소수 부분에 반올림 로직을 적용하지 않고 숫자의 정수 부분만 표시하려면 trunc를 사용하세요.
통화 형식 지정에서 반올림 모드 사용
반올림 모드는 통화 형식 지정과 자연스럽게 상호 작용합니다. 기업마다 통화 값을 반올림하는 방법에 대한 규칙이 다르며, roundingMode 옵션을 사용하면 해당 규칙을 구현할 수 있습니다.
const retailPrice = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
roundingMode: "ceil"
});
const wholesalePrice = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
roundingMode: "floor"
});
const calculatedPrice = 19.874;
console.log(retailPrice.format(calculatedPrice));
// Output: "$19.88"
console.log(wholesalePrice.format(calculatedPrice));
// Output: "$19.87"
소매업체는 수익성을 보장하기 위해 가격을 올림할 수 있고, 도매업체는 경쟁력을 유지하기 위해 내림할 수 있습니다. 동일하게 계산된 가격이 반올림 모드에 인코딩된 비즈니스 규칙에 따라 다른 표시 값을 생성합니다.