Blog
Boring Expenses parayı nasıl saklıyor (ve neden tam sayı olarak)
Bir kuruşu kaybetmenin klasik bir yolu var. Neredeyse her programlama diline 0.1 + 0.2 kaç eder diye sorun, size
0.30000000000000004 diyecektir. Bu dilin bir hatası değil; ikili kayan noktalı sayılar böyle çalışır. Çoğu ondalık kesri
tam olarak gösteremezler, bu yüzden küçük hatalar sızar. Fizik için sorun değil; para için sorun.
Bir finans uygulaması için “aşağı yukarı doğru” yanlış cevaptır. Bu yüzden Boring Expenses bir tutarı asla ondalık sayı olarak saklamaz.
En küçük birimi tam sayı olarak saklamak
Para yazılımlarının öteden beri kullandığı yöntem, en küçük birimle çalışıp onu tam sayı olarak tutmaktır. 4,20 ₺ yerine
420 saklarsınız, yani kuruş sayısını. Tam sayılar kesindir. Bütün gün toplayın, çıkarın, toplam alın; hiçbir yuvarlama
tozu birikmez.
Boring Expenses bir adım daha ileri giderek tutarları çok ince alt birimlerde saklar (“birim başına 100 milyon” gibi
düşünün). Bu, farklı para birimleri ve gelecekteki ihtiyaçlar için bolca pay bırakırken her şeyi sade bir Int olarak
tutar. Ekranda gördüğünüz değere dönüşüm yalnızca kenarlarda olur: bir tutar yazdığınızda ve onu göstermek için
biçimlendirdiğimizde.
// Örnek amaçlıdır, gerçek kodun aynısı değildir:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Bu sizin için neden önemli
- Toplamlar kesindir. Aylık toplamınız gerçek toplamdır; liste uzadıkça bir kuruş kayan bir sayı değil.
- Eşzamanlama tutarlı kalır. Bir tam sayı iPhone’da, Watch’ta ve iPad’de aynı anlama gelir. Uzlaştırılacak bir belirsizlik yoktur.
- Dışa aktarmalar güvenilirdir. Dışa aktardığınız CSV, uygulamayla kuruşu kuruşuna eşleşir.
Küçük, gösterişsiz bir karar; tam da sevdiğimiz türden. Onu hiç görmeyeceksiniz ve asıl mesele de bu: rakamlar tutar, o kadar.