Blog

Boring Expenses lưu tiền thế nào (và vì sao lại là số nguyên)

  • kỹ thuật
  • iOS
  • Swift

Có một cách kinh điển để mất một xu. Hỏi gần như bất kỳ ngôn ngữ lập trình nào 0.1 + 0.2 bằng bao nhiêu, nó sẽ trả lời 0.30000000000000004. Đó không phải lỗi của ngôn ngữ — số dấu phẩy động nhị phân vốn hoạt động như vậy. Chúng không biểu diễn chính xác được hầu hết phân số thập phân, nên những sai số nhỏ len vào. Với vật lý thì ổn; với tiền thì không.

Với ứng dụng tài chính, “gần đúng” là câu trả lời sai. Vì vậy Boring Expenses không bao giờ lưu số tiền dưới dạng số thập phân.

Lưu đơn vị nhỏ nhất dưới dạng số nguyên

Mẹo mà phần mềm tiền bạc dùng từ xưa là làm việc với đơn vị nhỏ nhất và giữ nó là số nguyên. Thay vì $4.20, bạn lưu 420 — số xu. Số nguyên là chính xác. Cộng, trừ, tính tổng cả ngày cũng không bao giờ tích tụ bụi làm tròn.

Boring Expenses còn đi xa hơn, lưu số tiền bằng những đơn vị con rất nhỏ (hãy hình dung “100 triệu cho mỗi đơn vị”), chừa nhiều khoảng trống cho các loại tiền tệ và nhu cầu sau này mà vẫn giữ mọi thứ là một Int đơn giản. Việc chuyển đổi sang con số bạn thấy trên màn hình chỉ diễn ra ở hai đầu — khi bạn gõ số tiền, và khi chúng tôi định dạng để hiển thị.

// Minh họa, không phải mã thật:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Vì sao điều này quan trọng với bạn

Đó là một quyết định nhỏ, không hào nhoáng — đúng loại chúng tôi thích. Bạn sẽ không bao giờ thấy nó, và đó chính là điểm mấu chốt: các con số cứ thế khớp nhau.