การใช้ java.math.RoundingMode

| ไอที | Java | 7866

รู้จักและใช้งาน java.math.RoundingMode

RoundingMode เป็นคลาส หนึ่ง ในคลาสมาตรฐานของ java ซึ่งอยู่ใน java.math.RoundingMode

RoundingMode คืออะไร RoundingMode ก็คือโหมด หรือพฤติกรรมในการกำหนดการปัดเศษสำหรับตัวเลข

ก่อนที่เราจะใช้ class นี้ได้ เราจะต้อง import java.math.RoundingMode มาใช้ก่อนครับ

สำหรับ RoudingMode แต่ละแบบนั้น แสดงการปัดเศษแต่ละแบบตามตัวอย่างในตารางด้านล่าง

ตัวเลขเริ่มต้นผลลัพธ์ที่ได้จากการปัดเศษ แบบ RoudingMode แบบต่าง ๆ
UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_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
    }
}
comments