نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
لغز الأرقام العشرية وفضيحة 0.1 + 0.2 (The Floating-Point Mystery) 🔍 الصدمة الحسابية في لغات البرمجة: عند كتابة 0.1 + 0.2 في double، يظهر الناتج 0.30000000000000004! ومقارنة (0.1 + 0.2 == 0.3) تُرجع False! التفسير العلمي: المعالج يعمل بالنظام الثنائي (Binary)، والأرقام العشرية البسيطة (0.1 و 0.2) تتحول لكسور دورية غير منتهية في الباينري مثل ثلث (0.333...). الأثر في بيئات العمل: في الأنظمة البنكية، خطأ بجزء من السنت يتراكم في ملايين المعاملات ليسبب عجزاً بملايين الجنيهات! مثلث الأرقام العشرية في C# (float vs double vs decimal) 📐 float (32-bit): دقة 7 أرقام، لاحقة إجبارية f (مثل 120.5f)، مثالي لمحركات الألعاب ورسوميات الجيمنج. double (64-bit): دقة 15-17 رقماً، النوع الافتراضي في C#، فائق السرعة على المعالج ومثالي للحسابات العلمية والهندسة. decimal (128-bit): دقة 29 رقماً، لاحقة إجبارية m (تذكرها بـ Money)، دقة عشرية مطلقة إجباري للبنوك والرواتب وبوابات الدفع. كواليس التمثيل الثنائي مقابل العشري (IEEE 754 vs Base-10 Decimal) ⚙️ معيار IEEE 754: يستخدمه float و double، يُقسم البايتات إلى إشارة وأس وجزء كسري، سريع فيزيائياً لكنه غير دقيق في قوى العشرة. معيار System.Decimal: يعمل بنظام الأساس العشري (Base-10)، يخزن الأرقام كأعداد صحيحة مقسومة على قوى 10، مطابق للنظام المحاسبي البشري بنسبة 100%. قواعد التحويل الصارم والتحويل اليدوي (Type Casting & Protection) 🛡️ حماية المترجم الصارمة: تمنع C# التحويل الضمني من decimal إلى double لحماية أموالك من فقدان الدقة العشوائي (CS0266). فلسفة مايكروسوفت: إذا أردت التحويل، يجب أن تصرح بذلك بنفسك وتتحمل المسؤولية. التحويل الصريح (Explicit Cast): تحويل إجباري باليد: double d = (double)money; أو decimal m = (decimal)distance; فخ المقارنة المباشرة ومفهوم هامش الخطأ (Equality Trap & Epsilon) 🎯 فخ المساواة المباشرة: استخدام == لمقارنة double يعتبر خطأً هندسياً فادحاً لأنه يفشل دائماً بفعل الفروقات الدقيقة. الحل بهامش الخطأ (Epsilon Tolerance): تعريف هامش سماحية صغير جداً (epsilon = 1e-7). المقارنة الآمنة: إذا كان Math.Abs(a - b) < epsilon، يُعتبر الرقمان متساويين منطقياً. القيم الاستثنائية في الأرقام العائمة (Special Values: Infinity & NaN) ⚡ القسمة على صفر: في الأعداد الصحيحة تنهار بـ DivideByZeroException، أما في double و float فلا تنهار وفق معيار IEEE 754. القيم الخاصة: 10.0 / 0.0 ترجع Infinity (مالانهاية)، و 0.0 / 0.0 ترجع NaN (غير معرف). دوال الفحص: double.IsInfinity(x) و double.IsNaN(x) لفحص وتأمين الحسابات. تحدي الحسابات المصرفية (Scenario: Interest is Interesting) 🏦 سيناريو البنك الاستثماري: فئة SavingsAccount تدير الأرصدة بدقة decimal وتحدد الفوائد. المهام الأربع: InterestRate تُرجع نسبة float حسب الرصيد، Interest تحسب قيمة الفائدة، AnnualBalanceUpdate تُحدث الرصيد، و YearsBeforeDesiredBalance تحسب سنوات الوصول بحلقة while. الحل الهندسي النموذجي لفئة SavingsAccount (Clean Code Implementation) 💎 الرشاقة بـ Switch Expression: استخدام الأنماط العلائقية (< 0m => 3.213f, < 1000m => 0.5f, ...). الدوال التعبيرية (=>): اختصار الدوال بسطر واحد رشيق ونظيف. التحويل الصريح الآمن: ((decimal)InterestRate(balance) / 100m) للدمج بين float و decimal. حلقة while: محاكاة التراكم السنوي وزيادة عداد السنوات حتى تجاوز الرصيد المستهدف. أشهر الفخاخ وتوصيات المعماريين (Floating-Point Pitfalls & Best Practices) 🛑 فخ نسيان اللاحقة m: كتابة decimal price = 19.99; تسبب خطأ ترجمة؛ اللاحقة m إجبارية. فخ استخدام double للمال: يسبب عجزاً خفياً في الميزانيات وتراكم الأخطاء. القاعدة الذهبية: الألعاب = float، الحسابات العامة = double، المعاملات المالية = decimal!