السلام عليكم ورحمة الله وبركاته
صادفت اليوم خطأ منطقي شل حركة النظام وهو كالتالي:
var_dump($total_amount);
var_dump($this->TOTAL_AMOUNT);
if( $total_amount != $this->TOTAL_AMOUNT){
echo "System price error {$total_amount} != {$this->TOTAL_AMOUNT}";
}
exit();
مخرجات الكود السابق كالتالي وهو ناتج غير منطقي:
float(344586.57) float(344586.57)
System price error 344586.57 != 344586.57
الناتج يعني أن الشرط محقق مع أن الرقمين متساويين حاولت استخدام معاملات المساواه من نفس النوع !== مع أن القيم في الأساس من نفس النوع وهو float ولكن دون جدوى
لم استطع تحديد سبب المُشكلة بعد لأجد لها حل o_O
لم أجرب إصدارات أخرى من اللغة لأن النظام يعتمد على بعض الدوال المحذوفة والترقية ستؤدي إلى توقف عمل النظام.
لا أرى أنه خطأ منطقي وهذا ليس خاصاً بلغة php فقط بل يشمل جميع اللغات (في اعتقادي) لأن المشكلة أكثر تعقيداُ ومتعلقة بالبنية الاساسية التي يقوم عليها عمل أجهزة الحاسب (الأخطاء الشائعة للفاصلة العائمة).
مثال: 1 قسمة ثلاثة، هل تساوي
0.3
أم:
0.33
أم:
0.33333333
في منطق الحاسب الآلي، فإن الأرقام المذكورة أعلاه مختلفة في قيمتها عن بعضها البعض!
لتجاوز هذه المعضلة، يجب دائماً تدوير (تقريب) النواتج إلى عدد محدد من الخانات بعد الفاصلة.
هذا مستند من ميكروسوفت يوضع تفاصيل أكثر مدعومة بأمثلة:
التعليقات