문제 소개
다음과 같은 부동소수점 숫자가 있다고 가정해 보겠습니다.
2.74
이 숫자를 4로 나누면 결과는 0.685입니다.
그런데 실제 상황에서는 이 숫자를 4로 나누되, 각 몫을 소수점 둘째 자리까지만 표현해야 하는 경우가 많습니다. 예를 들어 금액을 여러 사람에게 분배할 때처럼 말입니다.
즉, 원하는 결과는 다음과 같습니다.
0.69씩 3번, 그리고 나머지 0.67
검증해 보면 0.69 × 3 + 0.67 = 2.07 + 0.67 = 2.74로, 반올림 과정에서도 원래 값이 정확히 유지됩니다.
해결 방법
이 문제는 다음 단계로 해결할 수 있습니다.
- 전체 숫자를 원하는 등분 개수(parts)로 나눈 뒤, 지정한 자릿수(precision)로 반올림하여 몫(quo)을 구합니다.
- 몫에 (parts - 1)을 곱한 값을 전체 숫자에서 빼서 나머지(remainder)를 계산합니다. 마지막 한 조각이 반올림 오차를 흡수하는 역할을 합니다.
- 몫과 나머지가 같다면 모든 조각이 동일한 것이므로 parts와 value만 반환하고, 그렇지 않다면 parts - 1개의 동일한 값과 나머지를 함께 반환합니다.
코드 예제
이를 구현한 코드는 다음과 같습니다.
const num = 2.74;
const parts = 4;
const divideWithPrecision = (num, parts, precision = 2) => {
const quo = +(num / parts).toFixed(precision);
const remainder = +(num - quo * (parts - 1)).toFixed(precision);
if(quo === remainder){
return {
parts,
value: quo
};
}else{
return {
parts: parts - 1,
value: quo,
remainder
};
};
};
console.log(divideWithPrecision(num, parts));
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
{ parts: 3, value: 0.69, remainder: 0.67 }결과를 해석해 보면, 2.74를 4등분하려 할 때 0.69씩 3조각으로 나누고 남은 0.67이 나머지가 됩니다. 이 방식을 사용하면 반올림으로 인한 값의 손실 없이 원래 숫자를 그대로 보존할 수 있어, 금액 분배나 수량 계산 등 정확성이 중요한 작업에 유용하게 활용할 수 있습니다.