בלוג

איך 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))

למה זה חשוב לכם

החלטה קטנה ולא זוהרת – בדיוק מהסוג שאנחנו אוהבים. לעולם לא תראו אותה, וזה כל העניין: המספרים פשוט מסתדרים.