כיצד לעגל מספר למקומות עשרוניים ב- Java

1. סקירה כללית

במאמר קצר זה, נבחן כיצד לעגל מספר עד נ מקומות עשרוניים בג'אווה.

2. מספרים עשרוניים בג'אווה

Java מספקת שני סוגים פרימיטיביים בהם ניתן להשתמש לאחסון מספרים עשרוניים: לָצוּף ו לְהַכפִּיל. לְהַכפִּיל הוא הסוג המשמש כברירת מחדל:

כפול PI = 3.1415;

עם זאת, שני הסוגים לעולם אין להשתמש בהם לערכים מדויקים, כגון מטבעות. לשם כך, וגם לעיגול, אנו יכולים להשתמש ב- BigDecimal מעמד.

3. עיצוב מספר עשרוני

אם אנחנו רק רוצים להדפיס מספר עשרוני עם נ ספרות אחרי נקודה עשרונית, אנו יכולים פשוט לעצב את מחרוזת הפלט:

System.out.printf ("ערך עם 3 ספרות אחרי הנקודה העשרונית% .3f% n", PI); // פלטים: ערך עם 3 ספרות אחרי הנקודה העשרונית 3.142

לחלופין, אנו יכולים לעצב את הערך באמצעות ה- פורמט עשרוני מעמד:

DecimalFormat df = DecimalFormat חדש ("###. ###"); System.out.println (df.format (PI));

פורמט עשרוני מאפשר לנו לקבוע במפורש התנהגות עיגול, ולתת יותר שליטה בפלט מאשר String.format () משמש לעיל.

4. עיגול לְהַכפִּילעם BigDecimal

לעגל לְהַכפִּילs ל נ במקומות עשרוניים, נוכל לכתוב a שיטת עוזר:

סיבוב כפול סטטי פרטי (ערך כפול, מקומות int) {אם (מקומות <0) זורק IllegalArgumentException חדש); BigDecimal bd = BigDecimal חדש (Double.toString (ערך)); bd = bd.setScale (מקומות, RoundingMode.HALF_UP); החזר bd.doubleValue (); }

יש לשים לב לדבר אחד חשוב בפתרון זה - בעת בנייה BigDecimal; אנחנו חייבים השתמש תמיד BigDecimal (מחרוזת) בַּנַאִי. זה מונע בעיות עם ייצוג ערכים לא מדויקים.

נוכל להשיג את אותו הדבר באמצעות ספריית Apache Commons Math:

 org.apache.commons commons-math3 3.5 

הגרסה האחרונה תוכל למצוא כאן.

לאחר הוספת הספרייה לפרויקט, נוכל להשתמש ב- Precision.round () שיטה, שלוקחת שני ארגומנטים - ערך וסולם:

Precision.round (PI, 3);

כברירת מחדל, הוא משתמש באותה מידה HALF_UP שיטת עיגול כשיטת העוזר שלנו. לכן התוצאות צריכות להיות זהות.

שימו לב שנוכל לשנות את התנהגות העיגול על ידי העברת שיטת העיגול הרצויה כפרמטר שלישי.

5. עיגול זוגות עם DoubleRounder

DoubleRounder הוא כלי עזר בספריית decimal4j. הוא מספק שיטה מהירה ונטולת אשפה לעיגול כפול מ- 0 ל 18 נקודות עשרוניות.

אנו יכולים להשיג את הספרייה (הגרסה האחרונה תוכל למצוא כאן) על ידי הוספת התלות ב- pom.xml:

 org.decimal4j decimal4j 1.0.3 

כעת, אנו יכולים פשוט להשתמש ב:

DoubleRounder.round (PI, 3);

למרות זאת, DoubleRounder נכשל בכמה תרחישים, למשל:

System.out.println (DoubleRounder.round (256.025d, 2)); // פלטים: 256.02 במקום הצפוי 256.03

6. שיטת Math.round ()

דרך נוספת לעגל מספרים היא להשתמש בשיטת Math.Round ().

במקרה זה, אנו יכולים לשלוט נ מספר המקומות העשרוניים על ידי הכפל וחלוקה 10 ^ נ:

סיבוב כפול סטטי ציבורי RoundAvoid (ערך כפול, מקומות int) {סולם כפול = Math.pow (10, מקומות); להחזיר Math.round (ערך * סולם) / סולם; }

שיטה זו אינה מומלצת מכיוון שהיא מקטעת את הערך. במקרים רבים ערכים מעוגלים באופן שגוי:

System.out.println (roundAvoid (1000.0d, 17)); // פלטים: 92.23372036854776 !! System.out.println (roundAvoid (260.775d, 2)); // תפוקות: 260.77 במקום 260.78 צפויות

וכך, שיטה זו רשומה כאן למטרות למידה בלבד.

7. מסקנה

במדריך מהיר זה סקרנו טכניקות שונות לעיגול מספרים עד נ מקומות עשרוניים.

אנו יכולים פשוט לעצב את הפלט מבלי לשנות את הערך, או שנוכל לעגל את המשתנה בשיטת עוזר. סקרנו גם כמה ספריות העוסקות בבעיה זו.

את הקוד ששימש במהלך הדיון ניתן למצוא באתר GitHub.