السلام عليكم.
إذا كنت تبني تطبيق يتركز بشكل رئيسي على الأرقام والعمليات الحسابية.. ويتطلب دقة متناهية في الحسابات.. فهذا الموضوع راح يفيدك.
لأني اكتشفت اليوم إن الاعتماد على بنية ال php الأساسية في الحساب قد يؤدي إلى نتائج غير مرضية.
على سبيل المثال، العملية الحسابية التالية:
الناتج هو 8.كود:(0.1+0.7)*10
باستخدام PHP:
يطبع النتيجة 8 كما هو متوقع.كود PHP:
echo (0.1+0.7)*10;
الآن لو فرضنا أن نتيجة العملية الحسابية أرقام حقيقية، ونريدها أن تكون صحيحة فإننا سنستخدم (كما في العادة)، إما دالة intval أو النوع (int) للتحويل كما يلي:
الناتج من كل العمليتين السابقتين = 7، وليس 8 !! وهذا بالتأكيد نتيجة غير متوقعة. وهذا أيضًا يدل على ناتج العملية يتخزن في PHP على هيئة 7.999999 وعندما تستخدم intval فهو راح يلغي ما بعد الفاصلة فقط (Trunc).كود PHP:
echo (int) ((0.1+0.7)*10);
echo intval ((0.1+0.7) * 10 );
بالتالي الحذر مطلوب دائمًا في التطبيقات التي تحتاج عمليات حسابية دقيقة.
طبعًا استخدام الدالة round يحل المشكلة تقريبًا،
ولكن شخصيًا أفضّل استخدام امتداد BCMath http://www.php.net/bc. علمًا بأنها جاهزة للاستخدام من دون إعدادات إضافية على بيئة ويندوز.
والسلام.