Blog
Boring Expenses lưu tiền thế nào (và vì sao lại là số nguyên)
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
- Tổng luôn chính xác. Tổng của tháng là tổng thật, không phải con số lệch dần từng xu khi danh sách dài ra.
- Đồng bộ nhất quán. Một số nguyên mang cùng ý nghĩa trên iPhone, Watch và iPad. Không có gì mơ hồ cần đối chiếu.
- Tệp xuất đáng tin cậy. Tệp CSV bạn xuất khớp với ứng dụng đến từng xu.
Đó 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.