פונקציות מספריות

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; הראי של floor

  • POSIX::round - מעגל למספר השלם הקרוב ביותר, חצאים הרחק מאפס; השתמש בזה כשאתה רוצה עיגול סטטיסטי במקום חיתוך

  • sprintf עם "%.0f" - מעגל למספר השלם הקרוב ביותר, חצאים לזוגי (banker’s rounding) ברוב הפלטפורמות; שונה במעט מ־POSIX::round בערכי חצי