int#
מחזיר את החלק השלם של מספר, חיתוך לכיוון אפס.
int לוקח סקלר בודד, מאלץ אותו להקשר מספרי, ומשליך את החלק השברי שלו. ההשלכה היא תמיד לכיוון אפס - לא לכיוון אינסוף שלילי - כך ש־int(3.9) הוא 3 ו־int(-3.9) הוא -3, לא -4. מחרוזות לא־מספריות מומרות עם כללי ההמרה המספרית הרגילים של Perl (רווח מוביל, סימן אופציונלי, ספרות; השאר מושלך, עם אזהרת Argument "..." isn't numeric תחת use warnings). אם EXPR מושמט, int פועל על $_.
תקציר#
int EXPR
int
int($x)
מה מקבלים בחזרה#
מספר ללא חלק שברי, באותו סימן כמו הקלט. התוצאה היא ערך מספר שלם אם הגודל שנחתך מתאים לטווח המספרים השלמים המקומי של הפלטפורמה (בדרך כלל 64־ביט); אחרת Perl שומר אותו כערך נקודה צפה שהחלק השברי שלו במקרה הוא אפס. בכל מקרה הוא משווה ומודפס כמספר שלם.
my $n = int(7.8); # 7
my $m = int(-7.8); # -7
int אינו פונקציית עיגול. לעיגול, ראה ראו גם.
דוגמאות#
חיתוך חיובי - החלק השברי מושלך:
print int(3.9), "\n"; # 3
print int(3.1), "\n"; # 3
print int(3.0), "\n"; # 3
חיתוך שלילי - המלכודת. int חותך לכיוון אפס, כך ש־int(-3.9) הוא -3, שהוא גדול מ־-3.9. זה ההפך מפונקציית floor מתמטית:
print int(-3.9), "\n"; # -3 (not -4)
print int(-3.1), "\n"; # -3
עובד על $_ כשנקרא ללא ארגומנטים - שימושי בתוך map או while (<>):
my @whole = map { int } @floats; # truncate every element
מחרוזות מומרות, ושומרות את הקידומת המספרית המובילה:
print int("42.7 bottles"), "\n"; # 42
print int(" -5.5xyz"), "\n"; # -5
print int("hello"), "\n"; # 0 (with a warning under `use warnings`)
חלוקה המפיקה שבר, ולאחר מכן חיתוך - אידיום נפוץ לחלוקה שלמה של ערכים עם סימן, עם האזהרה לעיל לגבי שליליים:
my $pages = int($total_items / $per_page); # floor only for non-negative $total_items
ההפתעה הקלאסית של נקודה צפה. -6.725 / 0.025 הוא מתמטית -269, אך תוצאת IEEE-754 גדולה מעט מ־-269 (סביב -268.99999999999994). int חותך לכיוון אפס, ונותן -268:
print int(-6.725 / 0.025), "\n"; # -268, not -269
זה אינו באג של int - כל פונקציית חיתוך/עיגול חייבת להתמודד עם קלטים כאלה. ראה מקרי קצה להלן.
מקרי קצה#
intעל$_: ללא ארגומנט, פועל על$_. בתוךmap { int }זה מה שאתה רוצה; בתוך ביטוי גדול יותר זה עלול להפתיע קורא שפספס את הארגומנט המשתמע. העדףint($x)כשמשתנה המקור אינו מובן מאליו מההקשר.קלט שכבר־שלם:
int(5)הוא5. ללא המרה, ללא אזהרה, ללא איבוד דיוק.floats גדולים מאוד מאבדים דיוק לפני ש־
intרואה אותם. float בדיוק כפול יכול לייצג כל מספר שלם עד2**53בדיוק; מעבר לכך, ערכים ייצוגיים עוקבים מרווחים2, ואז4, ואז8.int(1e20)מחזיר float שערכו השלם קרוב אך לא שווה ל־10**20. אם אתה צריך מספרים שלמים גדולים מדויקים, שמור אותם כשלמים לאורך כל הדרך - אל תניתב אותם דרך נקודה צפה.ארטיפקטים של ייצוג נקודה צפה: קלטים כמו
-6.725 / 0.025(ראה דוגמאות) אינם נוחתים על המספר השלם המתמטי ש״אמורים״ ליפול עליו. השתמש ב־sprintf "%.0f"או ב־POSIX::floor/POSIX::ceilאם אתה צריך התנהגות עיגול שסובלת זאת.אינסופים ו־NaN:
int('Inf')מחזירInf;int('-Inf')מחזיר-Inf;int('NaN')מחזירNaN. ל־intאין מספר שלם לחתוך אליו, כך שהוא מחזיר את הערך המיוחד ללא שינוי. זה תואם לכל חלופה (sprintf "%d",POSIX::floor,POSIX::ceil) - אף אחת מהן לא נותנת לך מספר שלם סופי כאן.undef:int(undef)מחזיר0ופולט אזהרתUse of uninitialized valueתחתuse warnings.מחרוזות לא־מספריות:
int("abc")מחזיר0ופולטArgument "abc" isn't numericתחתuse warnings. מחרוזת שמתחילה בקידומת מספרית ("42abc") מניבה את הערך השלם של הקידומת (42) עם אותה אזהרה -intיורש זאת מההמרה המספרית הסטנדרטית של Perl, לא מפענוח מותאם.בוליאנים ו־dualvars:
intקורא את החצי המספרי.int(!!1)הוא1;int(!!0)הוא0. עבור dualvar שערכי המחרוזת והמספר שלו אינם מסכימים,intמשתמש בצד המספרי.
הבדלים מהמקור#
תאימות מלאה עם Perl 5.42 המקורי.
ראו גם#
abs- גודל ללא סימן; שלב עםintכשאתה רוצה את הגודל החתוך בלי קשר לסימןsprintf-sprintf "%d", $xגם חותך לכיוון אפס, אך בנוסף מעצב את התוצאה כמחרוזת; השתמש כשאתה רוצה את הערך החתוך וגם צורה טקסטואלית מסוימתPOSIX::floor- מעגל לכיוון אינסוף שלילי;floor(-3.9)הוא-4, וזה מה שרוב ההקשרים המתמטיים (גרפיקה, חלוקה לדליים) באמת רוציםPOSIX::ceil- מעגל לכיוון אינסוף חיובי;ceil(-3.1)הוא-3,ceil(3.1)הוא4; הראי שלfloorPOSIX::round- מעגל למספר השלם הקרוב ביותר, חצאים הרחק מאפס; השתמש בזה כשאתה רוצה עיגול סטטיסטי במקום חיתוךsprintfעם"%.0f"- מעגל למספר השלם הקרוב ביותר, חצאים לזוגי (banker’s rounding) ברוב הפלטפורמות; שונה במעט מ־POSIX::roundבערכי חצי