Blog
Cara Boring Expenses menyimpan uang (dan mengapa sebagai bilangan bulat)
Ada cara klasik untuk kehilangan satu sen. Tanyakan hampir semua bahasa pemrograman berapa 0.1 + 0.2, dan jawabannya
0.30000000000000004. Itu bukan bug bahasanya — memang begitulah cara kerja bilangan biner floating-point. Bilangan itu
tidak bisa merepresentasikan sebagian besar pecahan desimal dengan tepat, jadi kesalahan kecil menyusup. Tidak masalah
untuk fisika; masalah untuk uang.
Bagi aplikasi keuangan, “kira-kira benar” adalah jawaban yang salah. Karena itu Boring Expenses tidak pernah menyimpan jumlah sebagai bilangan desimal.
Simpan satuan terkecil sebagai bilangan bulat
Trik yang sudah lama dipakai perangkat lunak keuangan adalah bekerja dengan satuan terkecil dan menyimpannya sebagai bilangan
bulat. Alih-alih $4.20, Anda menyimpan 420 — jumlah sennya. Bilangan bulat itu tepat. Tambah, kurang, dan jumlahkan
seharian, dan tidak akan pernah ada debu pembulatan yang menumpuk.
Boring Expenses melangkah lebih jauh dengan menyimpan jumlah dalam subsatuan yang sangat halus (bayangkan “100 juta per
satuan”), sehingga ada banyak ruang untuk berbagai mata uang dan kebutuhan masa depan sambil tetap menyimpan semuanya
sebagai Int biasa. Konversi ke angka yang Anda lihat di layar hanya terjadi di tepi — saat Anda mengetik jumlah, dan saat
kami memformatnya untuk ditampilkan.
// Ilustrasi, bukan kode sebenarnya:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Mengapa ini penting bagi Anda
- Totalnya tepat. Total bulanan Anda adalah total yang sebenarnya, bukan angka yang bergeser satu sen seiring daftarnya bertambah.
- Sinkronisasi tetap konsisten. Bilangan bulat berarti hal yang sama di iPhone, Watch, dan iPad. Tidak ada ambiguitas yang perlu dicocokkan.
- Ekspor bisa dipercaya. CSV yang Anda ekspor cocok dengan aplikasi sampai ke sen terakhir.
Ini keputusan kecil yang tidak mencolok — persis jenis yang kami suka. Anda tidak akan pernah melihatnya, dan memang itu intinya: angkanya pas, itu saja.