숫자를 올림, 내림 또는 가장 가까운 값으로 반올림하는 방법

다양한 반올림 모드로 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));
// 출력: "2"

console.log(formatter.format(2.5));
// 출력: "3"

console.log(formatter.format(2.6));
// 출력: "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));
// 출력: "3"

console.log(formatter.format(-2.5));
// 출력: "-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));
// 출력: "3"

console.log(formatter.format(2.9));
// 출력: "3"

console.log(formatter.format(-2.1));
// 출력: "-2"

console.log(formatter.format(-2.9));
// 출력: "-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));
// 출력: "3"

계산 결과는 2.4개의 상자이지만, 상자의 일부분을 주문할 수는 없습니다. 올림을 하면 충분한 용량을 확보할 수 있습니다.

floor를 사용한 내림

'floor' 반올림 모드는 항상 음의 무한대 방향으로 반올림합니다. 양수의 경우 이는 내림을 의미합니다. 음수의 경우 이는 0에서 멀어지는 방향으로 반올림함을 의미합니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "floor"
});

console.log(formatter.format(2.1));
// 출력: "2"

console.log(formatter.format(2.9));
// 출력: "2"

console.log(formatter.format(-2.1));
// 출력: "-3"

console.log(formatter.format(-2.9));
// 출력: "-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));
// 출력: "$100"

내림을 사용하면 표시된 금액이 항상 실제 예산으로 달성 가능한 금액임을 보장합니다.

halfExpand를 사용한 가장 가까운 값으로 반올림

'halfExpand'는 기본값이지만, 코드에서 의도를 명확히 하기 위해 명시적으로 지정할 수 있습니다. 이 모드는 가장 가까운 값으로 반올림하고 중간값의 경우 0에서 멀어지는 방향으로 반올림합니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 1,
  roundingMode: "halfExpand"
});

console.log(formatter.format(2.14));
// 출력: "2.1"

console.log(formatter.format(2.15));
// 출력: "2.2"

console.log(formatter.format(2.16));
// 출력: "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));
// 출력: "$10.01"

console.log(ceilFormatter.format(10.999));
// 출력: "$11.00"

소수점 두 자리에서, 10.001은 10.00 또는 10.01로 반올림해야 합니다. ceil 모드는 올림하여 10.01을 생성합니다. 10.999 값은 11.00으로 올림됩니다.

trunc를 사용한 0 방향으로의 반올림

trunc 반올림 모드는 0 방향으로 반올림하며, 이는 숫자의 소수 부분을 제거함을 의미합니다. 양수의 경우 내림이 되고, 음수의 경우 올림이 됩니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "trunc"
});

console.log(formatter.format(2.1));
// 출력: "2"

console.log(formatter.format(2.9));
// 출력: "2"

console.log(formatter.format(-2.1));
// 출력: "-2"

console.log(formatter.format(-2.9));
// 출력: "-2"

이 모드는 효과적으로 소수 부분을 절삭합니다. 반올림 목적으로 소수 값을 고려하지 않고 숫자의 정수 부분만 표시하려는 경우에 유용합니다.

expand를 사용한 0에서 멀어지는 방향으로의 반올림

expand 반올림 모드는 0에서 멀어지는 방향으로 반올림합니다. 양수의 경우 올림이 되고, 음수의 경우 더 큰 크기로 내림이 됩니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "expand"
});

console.log(formatter.format(2.1));
// 출력: "3"

console.log(formatter.format(2.9));
// 출력: "3"

console.log(formatter.format(-2.1));
// 출력: "-3"

console.log(formatter.format(-2.9));
// 출력: "-3"

이 모드는 반올림이 항상 숫자의 크기를 증가시키도록 보장합니다. 과소평가보다 정확성을 우선시하는 방향으로 보수적이고자 하는 금융 컨텍스트에서 유용할 수 있습니다.

중간값 반올림 모드 이해하기

half로 시작하는 다섯 가지 모드는 모두 가장 가까운 값으로 반올림하지만, 정확히 중간에 있는 경우를 처리하는 방식이 다릅니다. 이러한 모드는 값이 두 개의 표현 가능한 숫자 사이에 정확히 위치할 때 동점 처리 동작에 대한 세밀한 제어를 제공합니다.

halfCeil 모드는 중간값을 양의 무한대 방향으로 반올림합니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfCeil"
});

console.log(formatter.format(2.5));
// 출력: "3"

console.log(formatter.format(-2.5));
// 출력: "-2"

halfFloor 모드는 중간값을 음의 무한대 방향으로 반올림합니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfFloor"
});

console.log(formatter.format(2.5));
// 출력: "2"

console.log(formatter.format(-2.5));
// 출력: "-3"

halfTrunc 모드는 중간값을 0 방향으로 반올림합니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfTrunc"
});

console.log(formatter.format(2.5));
// 출력: "2"

console.log(formatter.format(-2.5));
// 출력: "-2"

halfEven 모드는 중간값을 가장 가까운 짝수로 반올림합니다. 이 모드는 금융 계산에서 편향을 줄이기 때문에 은행가 반올림이라고도 불립니다.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfEven"
});

console.log(formatter.format(2.5));
// 출력: "2"

console.log(formatter.format(3.5));
// 출력: "4"

console.log(formatter.format(4.5));
// 출력: "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));
// 출력: "$19.88"

console.log(wholesalePrice.format(calculatedPrice));
// 출력: "$19.87"

소매업체는 수익성을 보장하기 위해 가격을 올림할 수 있고, 도매업체는 경쟁력을 유지하기 위해 내림할 수 있습니다. 동일한 계산 가격이라도 반올림 모드에 인코딩된 비즈니스 규칙에 따라 다른 표시 값이 생성됩니다.