การใช้ java.math.RoundingMode
รู้จักและใช้งาน java.math.RoundingMode
RoundingMode เป็นคลาส หนึ่ง ในคลาสมาตรฐานของ java ซึ่งอยู่ใน java.math.RoundingModeRoundingMode คืออะไร RoundingMode ก็คือโหมด หรือพฤติกรรมในการกำหนดการปัดเศษสำหรับตัวเลข
ก่อนที่เราจะใช้ class นี้ได้ เราจะต้อง import java.math.RoundingMode มาใช้ก่อนครับ
สำหรับ RoudingMode แต่ละแบบนั้น แสดงการปัดเศษแต่ละแบบตามตัวอย่างในตารางด้านล่าง
| ตัวเลขเริ่มต้น | ผลลัพธ์ที่ได้จากการปัดเศษ แบบ RoudingMode แบบต่าง ๆ | ||||||
|---|---|---|---|---|---|---|---|
| UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN | |
| 5.5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 | 
| 2.5 | 3 | 2 | 3 | 2 | 3 | 2 | 2 | 
| 1.6 | 2 | 1 | 2 | 1 | 2 | 2 | 2 | 
| 1.1 | 2 | 1 | 2 | 1 | 1 | 1 | 1 | 
| 1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 
| -1.0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 
| -1.1 | -2 | -1 | -1 | -2 | -1 | -1 | -1 | 
| -1.6 | -2 | -1 | -1 | -2 | -2 | -2 | -2 | 
| -2.5 | -3 | -2 | -2 | -3 | -3 | -2 | -2 | 
| -5.5 | -6 | -5 | -5 | -6 | -6 | -5 | -6 | 
RoundingMode.UP
| Input Number | Input rounded to one digit with UP rounding  | 
|---|---|
| 5.5 | 6 | 
| 2.5 | 3 | 
| 1.6 | 2 | 
| 1.1 | 2 | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | -2 | 
| -1.6 | -2 | 
| -2.5 | -3 | 
| -5.5 | -6 | 
จากตาราง RoudingMode.UP จะปัดเศษขึ้นเสมอเมื่อมีเศษ ดูตัวอย่างวิธีการใช้ด้านล่าง แต่สังเกตดูให้ดี เมื่อจำนวนเป็นลบ ค่าที่ได้จะลดลง นั่นคือจะคิดจากตัวเลข บวกหรือลบไม่มีส่วน เพราะจะปัดขึ้นจากเลขเดิม 1 เสมอเมื่อมีเศษ
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.UP);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: UP         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("4.1 rounds to " + nf.format(4.1)); // output 4.1 rounds to 5         System.out.println("5.5 rounds to " + nf.format(5.5)); // output 5.5 rounds to 6         System.out.println();     } }   RoundingMode.DOWN
| Input Number | Input rounded to one digit with DOWN rounding  | 
|---|---|
| 5.5 | 5 | 
| 2.5 | 2 | 
| 1.6 | 1 | 
| 1.1 | 1 | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | -1 | 
| -1.6 | -1 | 
| -2.5 | -2 | 
| -5.5 | -5 | 
จากตาราง RoudingMode.DOWN จะปัดเศษลงเสมอเมื่อมีเศษ ดูตัวอย่างวิธีการใช้ด้านล่าง แต่สังเกตดูให้ดี เมื่อจำนวนเป็นลบ ค่าที่ได้จะเพิ่มขึ้น นั่นคือจะคิดจากตัวเลข บวกหรือลบไม่มีส่วน เพราะจะปัดลงจากเลขเดิม 1 เสมอเมื่อมีเศษ
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.DOWN);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: DOWN         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("4.1 rounds to " + nf.format(4.1)); // output 4.1 rounds to 4         System.out.println("5.5 rounds to " + nf.format(5.5)); // output 5.5 rounds to 5         System.out.println("5.9 rounds to " + nf.format(5.9)); // output 5.9 rounds to 5         System.out.println();     } }   RoundingMode.CEILING
| Input Number | Input rounded to one digit with CEILING rounding  | 
|---|---|
| 5.5 | 6 | 
| 2.5 | 3 | 
| 1.6 | 2 | 
| 1.1 | 2 | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | -1 | 
| -1.6 | -1 | 
| -2.5 | -2 | 
| -5.5 | -5 | 
จากตาราง RoudingMode.CEILING จะปัดเศษขึ้นเสมอเมื่อมีเศษ ดูตัวอย่างวิธีการใช้ด้านล่าง แต่สังเกตดูให้ดี เมื่อจำนวนเป็นลบ ค่าที่ได้จะเพิ่มขึ้น ซึ่งแตกต่างจาก UP สรุปก็คือ CEILING ก็คือขอบบนนั่นเอง
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.CEILING);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: CEILING         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("4.1 rounds to " + nf.format(4.1)); // output 4.1 rounds to 5         System.out.println("5.5 rounds to " + nf.format(5.5)); // output 5.5 rounds to 6         System.out.println("5.9 rounds to " + nf.format(5.9)); // output 5.9 rounds to 6         System.out.println();     } }   RoundingMode.FLOOR
| Input Number | Input rounded to one digit with FLOOR rounding  | 
|---|---|
| 5.5 | 5 | 
| 2.5 | 2 | 
| 1.6 | 1 | 
| 1.1 | 1 | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | -2 | 
| -1.6 | -2 | 
| -2.5 | -3 | 
| -5.5 | -6 | 
จากตาราง RoudingMode.FLOOR จะปัดเศษลงเสมอเมื่อมีเศษ ดูตัวอย่างวิธีการใช้ด้านล่าง แต่สังเกตดูให้ดี เมื่อจำนวนเป็นลบ ค่าที่ได้จะลดลง ซึ่งแตกต่างจาก Down สรุปก็คือ FLOOR ก็คือขอบล่างนั่นเอง
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.FLOOR);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: FLOOR         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("4.1 rounds to " + nf.format(4.1)); // output 4.1 rounds to 4         System.out.println("5.5 rounds to " + nf.format(5.5)); // output 5.5 rounds to 5         System.out.println("5.9 rounds to " + nf.format(5.9)); // output 5.9 rounds to 5         System.out.println();     } }   RoundingMode.HALF_UP
| Input Number | Input rounded to one digit with HALF_UP rounding  | 
|---|---|
| 5.5 | 6 | 
| 2.5 | 3 | 
| 1.6 | 2 | 
| 1.1 | 1 | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | -1 | 
| -1.6 | -2 | 
| -2.5 | -3 | 
| -5.5 | -6 | 
จากตาราง RoudingMode.HALF_UP จะปัดเศษขึ้นตั้งแต่เศษมีค่าเท่ากับ 5 ขึ้นไป แปรง่าย ๆ ก็คือ ครึ่งหนึ่งให้ปัดขึ้น
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.HALF_UP);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: HALF_UP         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("4.1 rounds to " + nf.format(4.1)); // output 4.1 rounds to 4         System.out.println("4.5 rounds to " + nf.format(4.5)); // output 4.5 rounds to 5         System.out.println("4.9 rounds to " + nf.format(4.9)); // output 4.9 rounds to 5         System.out.println();     } }   RoundingMode.HALF_DOWN
| Input Number | Input rounded to one digit with HALF_DOWN rounding  | 
|---|---|
| 5.5 | 5 | 
| 2.5 | 2 | 
| 1.6 | 2 | 
| 1.1 | 1 | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | -1 | 
| -1.6 | -2 | 
| -2.5 | -2 | 
| -5.5 | -5 | 
จากตาราง RoudingMode.HALF_DOWN จะปัดเศษขึ้นตั้งแต่เศษมีค่ามากกว่า 5 ขึ้นไป แปรง่าย ๆ ก็คือ ครึ่งหนึ่งให้ปัดลง
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.HALF_DOWN);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: HALF_DOWN         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("4.1 rounds to " + nf.format(4.1)); // output 4.1 rounds to 4         System.out.println("4.5 rounds to " + nf.format(4.5)); // output 4.5 rounds to 4         System.out.println("4.9 rounds to " + nf.format(4.9)); // output 4.9 rounds to 5         System.out.println();     } }   RoundingMode.HALF_EVEN
| Input Number | Input rounded to one digit with HALF_EVEN rounding  | 
|---|---|
| 5.5 | 6 | 
| 2.5 | 2 | 
| 1.6 | 2 | 
| 1.1 | 1 | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | -1 | 
| -1.6 | -2 | 
| -2.5 | -2 | 
| -5.5 | -6 | 
จากตาราง RoudingMode.HALF_EVEN จะปัดเศษโดยดูตัวข้างหน้า ซึ่งถ้าตัวข้างหน้าเป็นเลขคี่ จะปัดในรูปแบบของ HALF_UP แต่ถ้าข้างหน้าเป็นเลขคู่ จะปัดในรูปแบบของ HALF_DOWN
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.HALF_EVEN);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: HALF_EVEN         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("3.5 rounds to " + nf.format(3.5)); // output 4.1 rounds to 4         System.out.println("4.5 rounds to " + nf.format(4.5)); // output 4.5 rounds to 4         System.out.println("5.5 rounds to " + nf.format(5.5)); // output 4.9 rounds to 5         System.out.println();     } }   RoundingMode.UNNECESSARY
| Input Number | Input rounded to one digit with UNNECESSARY rounding  | 
|---|---|
| 5.5 | throw ArithmeticException | 
| 2.5 | throw ArithmeticException | 
| 1.6 | throw ArithmeticException | 
| 1.1 | throw ArithmeticException | 
| 1.0 | 1 | 
| -1.0 | -1 | 
| -1.1 | throw ArithmeticException | 
| -1.6 | throw ArithmeticException | 
| -2.5 | throw ArithmeticException | 
| -5.5 | throw ArithmeticException | 
จากตาราง RoudingMode.HALF_EVEN จะปัดเศษเฉพาะการส่งข้อมูลมามีผลที่แน่นอนจึงปัดเศษที่ไม่จำเป็นทิ้ง เช่นปัดเลข 0 ที่ไม่จำเป็นออก ไม่งั้นแล้วจะมี Exception เกิดขึ้น
 import java.math.RoundingMode; import java.text.NumberFormat;  public class RoundingModeIndex {     public static void main(String[] args) {         NumberFormat nf = NumberFormat.getNumberInstance();         nf.setMaximumFractionDigits(0);         nf.setRoundingMode(RoundingMode.UNNECESSARY);         System.out.println("Default rounding mode: " + nf.getRoundingMode());         // output Default rounding mode: HALF_EVEN         System.out.println("4.0 rounds to " + nf.format(4.0)); // output 4.0 rounds to 4         System.out.println("4.1 rounds to " + nf.format(3.5));         // output java.lang.ArithmeticException:         // Rounding needed with the rounding mode being set to RoundingMode.UNNECESSARY     } }