Blog

Cara Boring Expenses menyimpan wang (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 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

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