Ιστολόγιο

Πώς αποθηκεύει το Boring Expenses τα χρήματα (και γιατί ως ακέραιο)

  • μηχανική
  • iOS
  • Swift

Υπάρχει ένας κλασικός τρόπος να χάσεις ένα λεπτό. Ρώτα σχεδόν οποιαδήποτε γλώσσα προγραμματισμού πόσο κάνει 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))

Γιατί σε αφορά

Είναι μια μικρή, αθόρυβη απόφαση – ακριβώς το είδος που μας αρέσει. Δεν θα τη δεις ποτέ, και αυτό είναι το νόημα: οι αριθμοί απλώς βγαίνουν.