Ιστολόγιο
Πώς αποθηκεύει το Boring Expenses τα χρήματα (και γιατί ως ακέραιο)
Υπάρχει ένας κλασικός τρόπος να χάσεις ένα λεπτό. Ρώτα σχεδόν οποιαδήποτε γλώσσα προγραμματισμού πόσο κάνει 0.1 + 0.2
και θα σου απαντήσει 0.30000000000000004. Δεν είναι σφάλμα της γλώσσας – έτσι λειτουργούν οι δυαδικοί αριθμοί κινητής
υποδιαστολής. Δεν μπορούν να αναπαραστήσουν ακριβώς τα περισσότερα δεκαδικά κλάσματα, οπότε γλιστρούν μέσα μικρά λάθη. Για
φυσική είναι εντάξει· για χρήματα όχι.
Για μια εφαρμογή οικονομικών, το «περίπου σωστό» είναι λάθος απάντηση. Γι’ αυτό το Boring Expenses δεν αποθηκεύει ποτέ ένα ποσό ως δεκαδικό αριθμό.
Η μικρότερη μονάδα ως ακέραιος
Το κόλπο που χρησιμοποιεί από πάντα το λογισμικό χρημάτων: υπολογίζεις στη μικρότερη μονάδα και την κρατάς ως ακέραιο. Αντί
για 4,20 € αποθηκεύεις 420 – τον αριθμό των λεπτών. Οι ακέραιοι είναι ακριβείς. Πρόσθεσε, αφαίρεσε και άθροισε όλη μέρα
και καμία σκόνη στρογγυλοποίησης δεν μαζεύεται.
Το Boring Expenses πάει ένα βήμα παραπέρα και αποθηκεύει τα ποσά σε πολύ λεπτές υπομονάδες (σκέψου «100 εκατομμύρια ανά
μονάδα»), αφήνοντας άφθονο χώρο για διάφορα νομίσματα και μελλοντικές ανάγκες, ενώ όλα μένουν ένα απλό Int. Η μετατροπή
σε ό,τι βλέπεις στην οθόνη γίνεται μόνο στις άκρες – όταν πληκτρολογείς ένα ποσό και όταν το μορφοποιούμε για εμφάνιση.
// Ενδεικτικό, όχι ο ακριβής κώδικας:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Γιατί σε αφορά
- Τα σύνολα είναι ακριβή. Το σύνολο του μήνα είναι το πραγματικό σύνολο, όχι ένας αριθμός που γλιστρά κατά ένα λεπτό καθώς η λίστα μεγαλώνει.
- Ο συγχρονισμός μένει συνεπής. Ένας ακέραιος σημαίνει το ίδιο σε iPhone, Watch και iPad. Δεν υπάρχει τίποτα αμφίσημο να συμφιλιωθεί.
- Οι εξαγωγές είναι αξιόπιστες. Το CSV που εξάγεις ταιριάζει με την εφαρμογή μέχρι το λεπτό.
Είναι μια μικρή, αθόρυβη απόφαση – ακριβώς το είδος που μας αρέσει. Δεν θα τη δεις ποτέ, και αυτό είναι το νόημα: οι αριθμοί απλώς βγαίνουν.