Blog
Cara Boring Expenses menyimpan wang (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 boleh merepresentasikan sebahagian besar pecahan desimal dengan tepat, jadi kesalahan kecil menyusup. Tidak masalah
untuk fisika; masalah untuk wang.
Bagi aplikasi kewangan, “kira-kira benar” adalah jawapan yang salah. Kerana itu Boring Expenses tidak pernah menyimpan jumlah sebagai bilangan desimal.
Simpan satuan terkecil sebagai bilangan bulat
Trik yang sudah lama digunakan perisian kewangan adalah bekerja dengan satuan terkecil dan menyimpannya sebagai bilangan
bulat. Alih-alih $4.20, anda menyimpan 420 — bilangan sennya. Bilangan bulat itu tepat. Tambah, kurang, dan jumlahkan
sepanjang hari, 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 wang dan kebutuhan masa depan sambil tetap menyimpan semuanya
sebagai Int biasa. Konversi ke angka yang anda lihat di skrin hanya terjadi di tepi — saat anda menaip 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.
- Penyegerakan tetap konsisten. Bilangan bulat berarti hal yang sama di iPhone, Watch, dan iPad. Tidak ada ambiguitas yang perlu dicocokkan.
- Eksport boleh dipercaya. CSV yang anda eksport sesuai 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 sahaja.