안녕하세요, 대부분 사용할 일이 절대 없을 법한 함수지만, 비트 연산이나 데이터 인코딩을 다루는 분들에겐 치명적일 수 있는 한셀의 BASE 함수 오류를 공유합니다.

1. BASE 함수의 기본 규약 (표준)
BASE 함수는 숫자를 지정한 진법의 문자로 변환해 주는 함수입니다.

구문: BASE(숫자, 진법, [최소길이])

예시: BASE(10, 2, 6)

표준 결과: "001010" (앞에 0이 붙은 텍스트)

엑셀, 구글 스프레드시트, 리브레오피스 칼크(Calc) 등 전 세계 모든 스프레드시트 엔진은 이 규약을 철저히 지킵니다. 특히 세 번째 인수인 '최소 길이'는 모자란 자릿수를 "0"으로 채우기(Padding) 위해 존재합니다.

2. 한셀의 치명적 오류: 규약 무시
한셀은 이 표준 규약을 완전히 무시하고 있습니다.

한셀 결과: BASE(10, 2, 6) → 1010 (숫자 혹은 자릿수가 무시된 텍스트)

이게 왜 문제냐면, 비트 연산에서 특정 위치의 값을 추출할 때 결과가 완전히 달라지기 때문입니다.

정상: LEFT("001010", 1) → 결과: "0"

한셀: LEFT(BASE(10, 2, 6), 1) → 결과: "1"

3. 수정 시도와 결론: "근본적인 설계 미스"
처음에는 한셀이 결과값을 강제로 숫자로 변환하는 단순 표시 오류인 줄 알았습니다. 그래서 다음과 같은 우회 방법을 시도해 보았습니다.

""&BASE(10, 2, 6)

left(BASE(10, 2, 6),6)

하지만 결과는 모두 실패였습니다. 셀이 숫자로 바꾼 게 아니라, 함수 엔진 자체가 애초에 "00"을 뺀 "1010"만을 내뱉고 있었기 때문입니다. 근본적으로 규약을 어긴 함수입니다.

4. 해결과 후기
제가 만든 음력→양력 변환 엔진이 유독 한셀에서만 2년 주기로 하루씩 오차가 발생했는데, 바로 이 BASE 함수가 범인이었습니다.

결국 한셀의 이 오류까지 감안하여 인코딩을 새로 짜서 문제를 해결했습니다. 덕분에 수정 버전은 이제 한셀에서도 100% 호환을 달성했습니다.

하지만 표준 규약을 무시하는 이런 오류는 실무에서 큰 혼란을 줄 수 있기에, 한컴 측에 정식으로 수정 요청 메일을 보낼 예정입니다.
혹시 비트 연산이나 진법 변환을 쓰시는 분들은 한셀 사용 시 각별히 주의하시기 바랍니다!