안녕하세요, 대부분 사용할 일이 절대 없을 법한 함수지만, 비트 연산이나 데이터 인코딩을 다루는 분들에겐 치명적일 수 있는 한셀의 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% 호환을 달성했습니다.
하지만 표준 규약을 무시하는 이런 오류는 실무에서 큰 혼란을 줄 수 있기에, 한컴 측에 정식으로 수정 요청 메일을 보낼 예정입니다.
혹시 비트 연산이나 진법 변환을 쓰시는 분들은 한셀 사용 시 각별히 주의하시기 바랍니다!
아..
건의 가능이라고 하고 버튼이 안눌러지네요 고객의 소리 항목으로 건의 로 올렸늕데
글 썼는데 안 올려지고 메일도 없고
혹시 한글에 글 올릴 수 있으신 분 계시면 올려 주세요
제가 올리려고 했던 글입니다.
-------------------------------------------
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"만을 내뱉고 있었기 때문입니다. 근본적으로 규약을 어긴 함수입니다.
표준 규약을 무시하는 이런 오류는 실무에서 큰 혼란을 줄 수 있기에, 수정 요청 드립니다.
대부분 평생 사용할 일이 절대 없을 법한 함수긴 하지만
제 경우 비트연산에서 저 오류 때문에 아예 한셀이란 플랲폼을 지원 못해준다고 공지했다가
지금은 수정해서 한셀 100% 호환을 하게 해드리긴 했습니다.
한셀이 국내외 많은 사용자에게 사랑받는 소프트웨어로 거듭나길 바라는 마음에서 이번 오류를 제보합니다. 글로벌 표준 규약을 준수하는 것은 타 플랫폼과의 호환성을 넘어 소프트웨어의 신뢰도와 직결되는 문제라고 생각합니다. 이번 피드백이 한셀의 완성도를 한 단계 더 높이는 계기가 되기를 진심으로 응원하며, 조속한 검토와 수정을 부탁드립니다.
안녕하세요~
좋은 연구이네요.
한셀에서
=RIGHT(REPT("0",6)&BASE(10,2),6)

이렇게 사용하시면 어떨까요?
오 진짜 기발한 방법입니다. 아니 저는 생각 못했던 방법이네요
방법이 떠오르지 않아서
정석대로 데이터 인코딩 부터 새로하는 방법으로 해결했습니다.
저것도 좋은 해결책이 될 수 있을 거 같습니다.
한셀 쓰시는 분들에게는요.
min_length 값을 줬음에도 0이 누락되는건 오류가 명백하네요 ㅎㅎ