round($x) מעגלת למספר השלם הקרוב, floor($x) תמיד מעגלת למטה ו-ceil($x) תמיד מעגלת למעלה. תנו ל-round() ארגומנט שני עבור ספרות אחרי הנקודה: round(3.14159, 2) הוא 3.14.
שלושתן מחזירות float, גם כשהערך שלם. var_dump(round(5)) מדפיסה float(5), אז המירו עם (int) כשאתם צריכים מספר שלם.
עיגול לשתי ספרות אחרי הנקודה
הארגומנט השני של round() הוא הדיוק. מספר חיובי מעגל לכמות כזו של ספרות אחרי הנקודה. מספר שלילי מעגל משמאל לנקודה העשרונית, וזה שימושי למספרים משוערים כמו "בערך 1,200 מבקרים".
round(3.10, 2) מדפיסה 3.1 כי ל-float אין מושג כמה אפסים רציתם. כשהמספר מוצג בדף (מחירים, אחוזים), עצבו אותו במקום זאת: 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(): כל פריט שנשאר עדיין צריך דף.
חילוק שלמים ומודולו
/ מחזיר float כשהחילוק לא מתחלק בדיוק, ולכן 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() נותנת לפעמים תשובה שגויה
floats נשמרים בבינארי, והרבה ערכים עשרוניים (כמו 0.1) לא ניתנים לשמירה מדויקת. רוב הזמן ההדפסה מסתירה את זה, אבל floor() ו-(int) לא מעגלות, הן חותכות, וערך כמו 7.999999999 הופך ל-7.
כשאתם צריכים ספרות עשרוניות מדויקות, כמו בכסף, שמרו יחידות שלמות (סנטים כמספרים שלמים: 1999 במקום 19.99) וחלקו רק לצורך הצגה. עיגול לדיוק הגיוני לפני floor() או ceil(), כמו בשורה האחרונה, פותר גם את רוב המקרים.
שאלות נפוצות
איך מעגלים לשתי ספרות אחרי הנקודה ב-PHP?
העבירו את מספר הספרות כארגומנט השני: round(3.14159, 2) מחזירה 3.14. היא מחזירה float, ולכן להצגה עם מספר קבוע של ספרות (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() מחזירה float ב-PHP?
round(), floor() ו-ceil() תמיד מחזירות float, גם כשהתוצאה שלמה: 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. ל-floats השתמשו ב-fmod(7.5, 2), שמחזירה 1.5.