본문 바로가기

코딩 이야기/델파이 코딩

델파이 Round 함수 동작 방식 및 주의사항

델파이 Round 함수 동작 방식 및 주의사항

델파이(및 일부 다른 프로그래밍 언어)에서 기본 Round 함수는 소수점 이하가 정확히 0.5인 경우, 우리가 흔히 생각하는 '무조건 올림' 방식을 사용하지 않습니다. 대신 '은행원 반올림(Banker's Rounding)' 이라는 규칙을 따릅니다.

주의: Round 함수에서 종종 예상과 다른 결과(오류로 인식될 수 있음)가 발생하는 것은 바로 이 은행원 반올림 규칙 때문입니다.

사용해야 할 PAS 유닛

uses SysUtils, Math;

은행원 반올림(Banker's Rounding) 규칙

  • 소수점 이하가 0.5가 아닌 경우에는 일반적인 반올림 규칙(0.5 미만 버림, 0.5 초과 올림)을 따릅니다.
  • 소수점 이하가 정확히 0.5인 경우, 결과값이 짝수가 되도록 반올림(또는 반내림)합니다.

Round 함수의 동작 예시

다음은 Round 함수가 은행원 반올림 규칙을 따르는 것을 보여주는 예시입니다.

var
  r1, r2, r3, r4, r5, r6: Integer; // r5, r6 추가
begin
  // 소수점 이하가 0.5가 아님 - 일반 반올림과 동일
  r1 := Round(3.7); // 결과: 4
  r2 := Round(3.3); // 결과: 3

  // 소수점 이하가 정확히 0.5 - 은행원 반올림 적용
  r3 := Round(3.5); // 결과: 4 (가장 가까운 짝수)
  r4 := Round(4.5); // 결과: 4 (가장 가까운 짝수)
  r5 := Round(5.5); // 결과: 6 (가장 가까운 짝수)
  r6 := Round(6.5); // 결과: 6 (가장 가까운 짝수)


  ShowMessage(Format('Round(3.7): %d', [r1])); // 4
  ShowMessage(Format('Round(3.3): %d', [r2])); // 3
  ShowMessage(Format('Round(3.5): %d', [r3])); // 4 <= 예상과 다를 수 있는 부분
  ShowMessage(Format('Round(4.5): %d', [r4])); // 4 <= 예상과 다를 수 있는 부분
  ShowMessage(Format('Round(5.5): %d', [r5])); // 6
  ShowMessage(Format('Round(6.5): %d', [r6])); // 6 <= 예상과 다를 수 있는 부분
end;

일반적인 산술 반올림이 필요한 경우

소수점 이하가 정확히 0.5일 때 무조건 올림하는 일반적인 산술 반올림 규칙을 따르고 싶다면, Math 유닛의 SimpleRoundTo 또는 RoundTo 함수를 사용할 수 있습니다.

  • SimpleRoundTo(X, -2) : 소수점 이하 첫째 자리에서 반올림하여 정수를 얻습니다 (일반 반올림).
  • RoundTo(X, Digit): 지정된 자릿수(Digit)에서 반올림합니다. Digit=0이면 소수점 첫째 자리, Digit=-2이면 정수 등.

SimpleRoundTo 함수 예시 (일반 반올림)

uses Math; // SimpleRoundTo 사용 시 필요

var
  sr1, sr2, sr3, sr4: Integer;
begin
  // SimpleRoundTo(-2) 사용 - 0.5에서 일반 반올림 규칙 적용
  sr1 := SimpleRoundTo(3.5, -2); // 결과: 4
  sr2 := SimpleRoundTo(4.5, -2); // 결과: 5
  sr3 := SimpleRoundTo(5.5, -2); // 결과: 6
  sr4 := SimpleRoundTo(6.5, -2); // 결과: 7


  ShowMessage(Format('SimpleRoundTo(3.5, -2): %d', [sr1])); // 4
  ShowMessage(Format('SimpleRoundTo(4.5, -2): %d', [sr2])); // 5 <= Round와 다른 부분
  ShowMessage(Format('SimpleRoundTo(5.5, -2): %d', [sr3])); // 6
  ShowMessage(Format('SimpleRoundTo(6.5, -2): %d', [sr4])); // 7 <= Round와 다른 부분
end;

따라서 델파이에서 Round 함수의 동작은 오류가 아니라 의도된 은행원 반올림 방식이며, 일반적인 산술 반올림이 필요할 때는 Math 유닛의 함수들을 사용해야 합니다.