블로그

Boring Expenses가 돈을 정수로 저장하는 이유

  • 엔지니어링
  • iOS
  • Swift

1원을 잃어버리는 고전적인 방법이 있습니다. 거의 모든 프로그래밍 언어에 0.1 + 0.2를 물어보면 0.30000000000000004라고 답합니다. 언어의 버그가 아니라 2진 부동소수점 숫자가 원래 그렇게 동작합니다. 대부분의 10진 소수를 정확히 표현하지 못해서 작은 오차가 끼어듭니다. 물리 계산이라면 괜찮지만, 돈이라면 괜찮지 않습니다.

가계부 앱에서 ‘대충 맞다’는 틀린 답입니다. 그래서 Boring Expenses는 금액을 소수로 저장하지 않습니다.

가장 작은 단위를 정수로 저장하기

돈을 다루는 소프트웨어가 오래전부터 써 온 방법은 가장 작은 단위로 계산하고 그것을 정수로 유지하는 것입니다. $4.20 대신 센트 수인 420을 저장합니다. 정수는 정확합니다. 하루 종일 더하고 빼고 합산해도 반올림 먼지가 쌓이지 않습니다.

Boring Expenses는 한 걸음 더 나아가 금액을 아주 세밀한 하위 단위(‘1단위당 1억’ 정도)로 저장합니다. 덕분에 다양한 통화와 앞으로의 필요를 위한 여유를 충분히 두면서도 모든 것을 평범한 Int로 유지할 수 있습니다. 화면에 보이는 값과의 변환은 가장자리, 즉 금액을 입력할 때와 표시용으로 서식을 입힐 때만 일어납니다.

// 설명용 예시이며 실제 코드 그대로는 아닙니다:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

이것이 당신에게 중요한 이유

작고 눈에 띄지 않는 결정입니다. 저희가 좋아하는 종류의. 당신은 이걸 볼 일이 없겠지만, 그게 핵심입니다. 숫자가 그냥 맞아떨어질 뿐입니다.