Blog

Cara Boring Expenses menyimpan uang (dan mengapa sebagai bilangan bulat)

  • rekayasa
  • iOS
  • Swift

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

Ini keputusan kecil yang tidak mencolok — persis jenis yang kami suka. Anda tidak akan pernah melihatnya, dan memang itu intinya: angkanya pas, itu saja.