موضوع 70 از 91· سافٹ ویئر انجینئرنگ اور ڈیجیٹل ڈیلیوری
سینٹ تک درست لاگت کی تقسیم
کسی کل رقم — مشترکہ سبسڈی، بنیادی ڈھانچے کا بل، بجٹ اثر کا عدد — کو سادہ فیصد ریاضی سے کئی وصول کنندگان میں تقسیم کرنے پر اکثر ایسے حصے نکلتے ہیں جو جمع کرنے پر اصل کل کے برابر نہیں ہوتے۔ سینٹ تک درست تقسیم اس کا علاج ہے: ایک صحیح عدد/اعشاری طریقہ جو کرنسی کی سب سے چھوٹی اکائی (سینٹ) میں کام کرتا ہے اور ضمانت دیتا ہے کہ حصے بالکل کل کے برابر جمع ہوں گے، تقسیم چاہے کتنی ہی غیر ہموار ہو۔ ہر سافٹ ویئر انجینئر جسے تقسیم شدہ کل کو سینٹ تک ملانا ہو — تنخواہیں، سبسڈی کی ادائیگی، مشترکہ خدمات کا چارج — کو یہ پیٹرن چاہیے، فلوٹنگ پوائنٹ فیصد نہیں۔
یہ کیوں اہم ہے
یہ انٹرپرائز سافٹ ویئر انجینئرنگ کا ایک نامزد بنیادی پیٹرن ہے: Martin Fowler کی Patterns of Enterprise Application Architecture (2002) Money اور Allocate کو اسی لیے دستاویز کرتی ہے کہ "$100 کو تین حصوں میں بانٹنا" ایسا مسئلہ ہے جسے سادہ کوڈ ہمیشہ غلط کرتا ہے، اور خاموشی سے غلط کرتا ہے — غلطی تب ظاہر ہوتی ہے جب کوئی کھاتے ملاتا ہے اور دیکھتا ہے کہ حصے کل سے ایک سینٹ کم (یا زیادہ) ہیں۔ صحت کی معاشیات اور NHS کے مالیاتی کام میں یہ نظری نہیں: ایک بجٹ اثر کا عدد مقام، سال یا ٹرسٹ کے لحاظ سے بانٹا جاتا ہے؛ مشترکہ بنیادی ڈھانچے اور لائسنس کی لاگت عملے کی تعداد یا سرگرمی کے تناسب کے مطابق محکموں میں تقسیم ہوتی ہے۔ ان میں سے ہر تقسیم کو بالکل ملنا چاہیے، کیونکہ جو مالیاتی ڈائریکٹر ایسے حصے پاتا ہے جو کل کے برابر نہیں جڑتے وہ پورے ماڈل پر اعتماد کھو دے گا۔
ریاضی
سادہ طریقہ (غلط):
حصہ_i = گول(کل × تناسب_i / Σ تناسب) — ہر حصے کو الگ الگ گول کرتا ہے
درست طریقہ (سب سے بڑا بقیہ / "largest remainder allocation"):
1. بنیاد_i = فرش(کل_سب_سے_چھوٹی_اکائی_میں × تناسب_i / Σ تناسب) — صرف مکمل سب سے چھوٹی اکائیاں (سینٹ)
2. بقیہ = کل_سب_سے_چھوٹی_اکائی_میں − Σ بنیاد_i — بچے ہوئے سینٹ، ہمیشہ < وصول کنندگان کی تعداد
3. مرحلہ 1 سے سب سے بڑے کسری حصے والے `بقیہ` وصول کنندگان میں سے ہر ایک کو
1 اضافی سب سے چھوٹی اکائی دیں جب تک بقیہ ختم نہ ہو
نتیجہ: Σ حصہ_i == کل ہمیشہ، بناوٹ کے اعتبار سے
درست طریقہ کبھی کسی ایک حصے کو الگ سے گول نہیں کرتا — یہ پوری تقسیم کو ایک ہی عمل کے طور پر گول کرتا ہے، اور یہی مجموعے کے ناقابلِ تبدیل ہونے کو سچ بناتا ہے۔
حل شدہ مثال
$100.00 کو تین برابر حصوں میں تقسیم کریں (تناسب = [1, 1, 1])۔
سادہ طریقہ: $100.00 ÷ 3 = $33.333… ہر ایک کو الگ سے قریب ترین سینٹ تک گول کرنے سے فی وصول کنندہ $33.33 ملتا ہے۔ مجموعہ: $33.33 × 3 = $99.99 — ایک سینٹ غائب ہے، اور کوئی اکیلی مد اتنی "غلط" نہیں کہ آنکھ سے پکڑی جائے۔
درست طریقہ: تینوں کے لیے بنیاد = $33.33 (فرش(10,000 / 3) = 3,333 سینٹ فی وصول کنندہ سے کل 9,999 سب سے چھوٹی اکائیاں)۔ 1 سینٹ بچتا ہے (10,000 − 9,999)۔ وہ اکلوتا بچا ہوا سینٹ اس وصول کنندہ کو جاتا ہے جس کے تقسیم میں سب سے بڑا کسری حصہ ہے — ٹھیک کون سا وصول کنندہ، یہ برابری توڑنے کی اندرونی تفصیل ہے، جس پر پکارنے والے کو انحصار نہیں کرنا چاہیے۔ دو وصول کنندگان کو $33.33 اور ایک کو $33.34 ملتا ہے، اور تینوں حصے بالکل $100.00 جمع ہوتے ہیں۔
یہی وہ ریاضی ہے جو بجٹ اثر کا تجزیہ کو درکار ہوتی ہے جب بھی کل بجٹ اثر کا عدد مقام، آبادی کے گروہ یا مالی سال کے لحاظ سے تقسیم کر کے شائع شدہ کل سے ملانا ہو — ایسی بہت سی مدوں کو بغیر انحراف جمع کرنے کے ساتھی مسئلے کے لیے کرنسی کے لحاظ سے محفوظ لاگت کا مجموعہ دیکھیں۔
سافٹ ویئر انجینئرنگ سے تعلق
یہ انٹرپرائز سافٹ ویئر فن تعمیر کا "Money پیٹرن" بالکل وہی ہے — خرابی کی اسی مخصوص قسم کے لیے نامزد بنیادی پیٹرن، کوئی ایک بار کی چال نہیں۔ اسی خرابی سے حقیقی مالی ملاپ کی ناکامیاں پروڈکشن تک پہنچی ہیں: f64 میں نکالی گئی تناسبی تقسیم، فی وصول کنندہ گول کی گئی، اور اصل کل کے خلاف کبھی جانچی نہیں گئی۔ یہ اس ذخیرے کے ملکیت کی کل قیمت ماڈیول سے براہِ راست جڑتا ہے، جو فی الحال برسوں اور اختیارات میں عام فلوٹنگ پوائنٹ لاگت جمع کرتا ہے — وہی درستی کا نظم لاگو ہوتا ہے جب TCO یا بجٹ اثر کے کل کو صرف جمع نہیں، مختص کرنا ہو۔
عام غلطیاں
- سب سے بڑے بقیہ کی جگہ فیصد پھر گول کرنا: فلوٹنگ پوائنٹ فیصد سے مختص کرنا اور ہر وصول کنندہ کو الگ سے گول کرنا، جو گول کرنے کی غلطیاں بڑھاتا ہے اور شاذ ہی کل پر لوٹ کر جڑتا ہے، خاص طور پر بہت سے وصول کنندگان کے ساتھ۔
- کرنسی کی سب سے چھوٹی اکائی کے قوت نما کو نظر انداز کرنا: یہ فرض کرنا کہ ہر کرنسی کے 2 اعشاری مقامات ہیں — جاپانی ین میں 0، کچھ کرنسیوں میں 3 — ہاتھ سے لکھی تناسبی تقسیم اکثر 2 کو جامد کر دیتی ہے اور دوسری کرنسیوں کے ساتھ خاموشی سے ٹوٹتی ہے۔ درست تقسیم کا معمول قوت نما کرنسی ہی سے پڑھتا ہے (ISO 4217)۔
- پہلے سے مختص بقیہ کی دوبارہ تقسیم: پچھلی تقسیم کے بچے ہوئے حصے پر تقسیم کا معمول دوبارہ چلانا، بغیر ہم قوتی کی جانچ کے، جو اسی وصول کنندہ کو وہی سینٹ دو بار جمع کر سکتا ہے۔
ذرائع
- Fowler M. "Patterns of Enterprise Application Architecture." Addison-Wesley, 2002 —
MoneyاورAllocateپیٹرن۔ - ISO 4217 — کرنسی اور فنڈ کوڈز کا معیار، جو ہر کرنسی کی سب سے چھوٹی اکائی کا قوت نما متعین کرتا ہے۔