Menu
flag Ar iconالعربيةdown icon

التقريب في PHP: round() وfloor() وceil() والرياضيات

تقرّب round($x, 2) إلى منزلتين عشريتين، وتقرّب floor() دائمًا إلى الأسفل، وتقرّب ceil() دائمًا إلى الأعلى. وأيضًا intdiv() والعامل % و** للأسس وabs() وmax() وmin() وrandom_int() للأعداد العشوائية.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تقرّب round($x) إلى أقرب عدد صحيح، وتقرّب floor($x) دائمًا إلى الأسفل، وتقرّب ceil($x) دائمًا إلى الأعلى. أعطِ round() وسيطًا ثانيًا لعدد المنازل العشرية: round(3.14159, 2) تساوي 3.14.

الثلاث تعيد عددًا عشريًا، حتى عندما تكون القيمة صحيحة. تطبع var_dump(round(5)) القيمة float(5)، لذا حوّل بـ (int) عندما تحتاج إلى عدد صحيح.

التقريب إلى منزلتين عشريتين

الوسيط الثاني لـ round() هو الدقة. العدد الموجب يقرّب إلى ذلك العدد من المنازل العشرية. والعدد السالب يقرّب إلى يسار الفاصلة العشرية، وهذا مفيد للأرقام التقريبية مثل «نحو 1,200 زائر».

تطبع round(3.10, 2) القيمة 3.1 لأن العدد العشري لا يعرف كم صفرًا أردت. وعندما يُعرض العدد في صفحة (الأسعار والنسب المئوية)، نسّقه بدلًا من ذلك: تحوّل number_format() العدد 3.1 إلى "3.10" بـ number_format(3.1, 2)، وتفعل sprintf('%.2f', $x) الشيء نفسه.

تقريب النصف إلى الأعلى أو الأسفل أو الزوجي

افتراضيًا تقرّب round() النصف بعيدًا عن الصفر، وهو التقريب الذي تعلّمه معظمنا في المدرسة. ويختار الوسيط الثالث قاعدة مختلفة للقيم التي تقع في المنتصف تمامًا بين عددين.

PHP_ROUND_HALF_EVEN هو «تقريب المصرفيين»: تذهب الأنصاف إلى أقرب عدد زوجي، فلا ينحرف تقريب قيم كثيرة إلى الأعلى مع الوقت. وكثيرًا ما تحتاجه برامج المحاسبة.

floor وceil مع الأعداد السالبة

تتجه floor() نحو سالب ما لا نهاية وceil() نحو موجب ما لا نهاية. ومع الأعداد السالبة يفاجئ ذلك المبرمجين: floor(-3.5) تساوي -4، لا -3. وإذا أردت قطع المنازل العشرية (باتجاه الصفر)، فحوّل إلى int بدلًا من ذلك.

سطر ترقيم الصفحات هو الاستخدام الكلاسيكي لـ ceil(): أي عنصر متبقٍ يحتاج إلى صفحة أيضًا.

القسمة الصحيحة وباقي القسمة

يعيد / عددًا عشريًا عندما لا تكون القسمة تامة، لذا فإن 7 / 2 تساوي 3.5. وللقسمة الصحيحة استخدم intdiv()، التي تحذف الباقي، و% للباقي نفسه.

يحوّل % المعاملين إلى أعداد صحيحة أولًا، لذا فإن 7.5 % 2 تساوي 1، ومنذ PHP 8.1 يطبع أيضًا Deprecated: Implicit conversion from float 7.5 to int loses precision. استخدم fmod() عندما تهمك المنازل العشرية. والقسمة على صفر بـ / أو intdiv() أو % تطلق DivisionByZeroError في PHP 8، لذا تحقق من المقسوم عليه أولًا عندما يأتي من المدخلات.

الأسس والجذور وabs وmax وmin

يرفع ** إلى أس (وpow() تفعل الشيء نفسه)، وتأخذ sqrt() الجذر التربيعي، وتزيل abs() الإشارة. وتأخذ max() وmin() إما عدة وسائط أو مصفوفة واحدة.

يُقيَّم ** من اليمين إلى اليسار، لذا فإن 2 ** 3 ** 2 تعني 2 ** 9. والزوج max(0, min(100, $x)) هو الطريقة المعتادة لحصر قيمة بين حد أدنى وحد أعلى. ويحمل M_PI قيمة باي إذا احتجتها للدوائر.

الأعداد العشوائية باستخدام random_int وrand

تعيد random_int($min, $max) عددًا صحيحًا عشوائيًا يشمل الطرفين. تتغير المخرجات في كل تشغيل، فاضغط Run عدة مرات.

استخدم random_int() لأي شيء متعلق بالأمان: رموز الدخول، والرموز المميزة، وروابط إعادة تعيين كلمة المرور. ما زالت rand() وmt_rand() تعملان وتقبلان الوسيطين ($min, $max) نفسيهما، لكن يمكن التنبؤ بتسلسلهما. وللخلط والاختيار بمصدر آمن، أضافت PHP 8.2 الصنف Random\Randomizer ($r->getInt(1, 6) و$r->shuffleArray($a)).

لماذا تعطي floor() أحيانًا إجابة خاطئة

تُخزَّن الأعداد العشرية بالنظام الثنائي، ولا يمكن تخزين كثير من القيم العشرية (مثل 0.1) بدقة. في معظم الأحيان تخفي الطباعة ذلك، لكن floor() و(int) لا تقرّبان بل تقطعان، فتصبح قيمة مثل 7.999999999 مساوية لـ 7.

عندما تحتاج إلى منازل عشرية دقيقة، كما في المبالغ المالية، خزّن الوحدات الكاملة (السنتات كأعداد صحيحة: 1999 بدلًا من 19.99) ولا تقسم إلا عند العرض. والتقريب إلى دقة معقولة قبل floor() أو ceil()، كما في السطر الأخير، يصلح معظم الحالات أيضًا.

الأسئلة الشائعة

كيف أقرّب إلى منزلتين عشريتين في PHP؟

مرّر عدد المنازل العشرية كوسيط ثانٍ: تعيد round(3.14159, 2) القيمة 3.14. وهي تعيد عددًا عشريًا، لذا للعرض بعدد ثابت من المنازل العشرية (3.10 بدلًا من 3.1) استخدم number_format($x, 2) أو sprintf('%.2f', $x).

كيف أقرّب إلى الأسفل في PHP؟

تقرّب floor($x) إلى العدد الصحيح الأدنى التالي: floor(4.9) تساوي 4 وfloor(-4.1) تساوي -5. ولحذف المنازل العشرية باتجاه الصفر بدلًا من ذلك، حوّل بـ (int) $x، التي تجعل -4.9 تساوي -4.

لماذا تعيد round() عددًا عشريًا في PHP؟

تعيد round() وfloor() وceil() دائمًا عددًا عشريًا، حتى عندما تكون النتيجة صحيحة: تطبع var_dump(round(5)) القيمة float(5). ضع الاستدعاء داخل (int) أو intval() عندما تحتاج إلى عدد صحيح، مثلًا كفهرس لمصفوفة.

ما الفرق بين rand() وrandom_int() في PHP؟

تستخدم random_int(1, 6) مصدرًا آمنًا تشفيريًا، وهي المناسبة للرموز والأكواد وأي شيء قد يحاول مستخدم تخمينه. أما rand() وmt_rand() فأسرع لكن يمكن التنبؤ بهما. والثلاث تشمل طرفي النطاق.

كيف أحصل على باقي القسمة في PHP؟

استخدم العامل % للأعداد الصحيحة: 17 % 5 تساوي 2. وتأخذ النتيجة إشارة المعامل الأيسر، لذا فإن -7 % 3 تساوي -1. وللأعداد العشرية استخدم fmod(7.5, 2)، التي تعيد 1.5.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن