בלוג
איך 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 שמייצאים תואם לאפליקציה עד האגורה.
החלטה קטנה ולא זוהרת – בדיוק מהסוג שאנחנו אוהבים. לעולם לא תראו אותה, וזה כל העניין: המספרים פשוט מסתדרים.