การใช้ java.math.BigDecimal

| ไอที | Java | 15469

รู้จักกับ java.math.BigDecimal และการใช้งานต่าง ๆ

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

Decimal ก็คือจำนวนทศนิยม Big ก็คือ ขนาดใหญ่ ดังนั้น BigDecimal ก็คือ จำนวนทศนิยมที่มีขนาดใหญ่ ๆ นั่นเอง

เมื่อเวลาเราใช้ จำนวนทศนิยม เราอาจจะใช้ ชนิด float หรือ double แต่เมื่อข้อมูลมีขนาดใหญ่มาก ๆ ชนิด float หรือ double จะเก็บข้อมูลไม่หมด ดังนั้น วิธีการแก้ปัญหา ก็คือ ใช้ class ของ java ที่มีชื่อว่า Decimal ครับ ดังนั้น เรามาดูวิธีใช้ class นี้กันครับ
import java.math.BigDecimal;

public class BigDecimalIndex {
    public static void main(String[] args) {
        BigDecimal bn1 = new BigDecimal("398169328193312379123.35632456234567890");
        BigDecimal bn2 = new BigDecimal("65746751673563487331231912301230.34586558");
        BigDecimal bn3 = bn1.multiply(bn2);
        System.out.println(bn3);
    }
}
//output = 26178339944755310101662190715036663837316879275011399.0544271870789813932422620

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

ส่วนตัวอย่างอื่น ๆ ดูตามด้านล่างครับ

Field ใน BigDecimal

Filelo ต่าง ๆ ใน class BigDecimal ซึ่งเป็นชนิด static นั่นคือเวลาเรียกใช้ ก็เขียนชื่อ class ตามด้วย ชื่อ Field เรามาดูชื่อ Field กับตัวอย่างกันครับ ตามด้านล่างเลย
static BigDecimalONE
static intROUND_CEILING
static intROUND_DOWN
static intROUND_FLOOR
static intROUND_HALF_DOWN
static intROUND_HALF_EVEN
static intROUND_HALF_UP
static intROUND_UNNECESSARY
static intROUND_UP
static BigDecimalTEN
static BigDecimalZERO

มาดูตัวอย่างกันครับ
import java.math.BigDecimal;

public class BigDecimalIndex {
    public static void main(String[] args) {
        BigDecimal bd = new BigDecimal("123456789.0163456890");
        
        System.out.println(bd.add(BigDecimal.ONE));
        System.out.println(bd.add(BigDecimal.valueOf(1)));
        // output = 123456790.0163456890
        
        System.out.println(bd.add(BigDecimal.TEN));
        System.out.println(bd.add(BigDecimal.valueOf(10)));
        // output = 123456799.0163456890
        
        System.out.println(bd.add(BigDecimal.ZERO));
        System.out.println(bd.add(BigDecimal.valueOf(0)));
        // output = 123456789.0163456890
    }
}
จากตัวอย่างด้านบน เราจะใช้ class BigDecimal ก็ต้อง import java.math.BigDecimal; ก่อน ที่บรรทัดแรกครับ
จากนั้น ในบรรทัดที่ 5 เราสร้าง Object BigDecimal มีชื่อว่า bd โดยรับ Constructors เป็นสตริง คือค่า จำนวนทศนิยมนั่นเอง
จากนั้นเรา ในบรรทัดที่ 7 เราแสดงทางหน้าจอออกมา ซึ่งแสดงค่า bd ใช้ method add นั่นก็คือการบวก ใช้ BigDecimal.ONE ซึ่งก็คือหนึ่งนั่นเอง ซึ่งก็เหมือนกับการใช้ BigDecimal.valueOf(1) นั่นเอง และเมื่อรันออกมาจะได้ค่า bd +1 เหมือนกัน
BigDecimal.TEN ก็คือค่า 10 ส่วน BigDecimal.ZERO ก็คือค่า 0 นั่นเอง
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalIndex {
    public static void main(String[] args) {
        BigDecimal bd = new BigDecimal("123456789.0163456890");
        System.out.println(bd.setScale(3, RoundingMode.UP));
        // output = 123456789.017
        
        System.out.println(bd.setScale(3, RoundingMode.DOWN));
        // output = 123456789.016
        
        BigDecimal bd2 = new BigDecimal("6.5");
        System.out.println(bd2.setScale(0, RoundingMode.HALF_DOWN));
        // output = 6
        System.out.println(bd2.setScale(0, RoundingMode.HALF_UP));
        // output = 7
        
        BigDecimal bd3 = new BigDecimal("6.5");
        System.out.println(bd3.setScale(0, RoundingMode.HALF_EVEN));
        // output = 6
        
        BigDecimal bd4 = new BigDecimal("3.5");
        System.out.println(bd4.setScale(0, RoundingMode.HALF_EVEN));
        // output = 4
    }
}
ในตัวอย่างข้างบน เราสร้าง Object BigDecimal ชื่อ bd จากนั้นเราแสดง bd.setScale เป็นการเซตค่ารูปแบบการแสดงผลของ bd ซึ่ง Constructors ตัวเลข ก็คือจำนวนทศนิยมที่ต้องการแสดง ส่วน Constructors ตัวที่สองเป็น RoundingMode ซึ่งไว้จะอธิบายทีหลังครับ
ตอนแรกเราใช้ RoundingMode.UP เพื่อให้ปัดเศษขึ้น ไม่ว่าข้างหลังจะเลขอะไรก็ตาม จากนั้นก็ใช้ RoundingMode.DOWN เพื่อให้ปัดเศษลง ไม่ว่าข้างหลังจะเป็นเลขอะไรก็ตาม แล้วเราใช้ RoundingMode.HALF_DOWN เพื่อกำหนดว่าถ้าตัวที่ตามหลังมีค่าน้อยกว่าหรือเท่ากับ 5 ให้ปัดลงนอกนั้นปัดขั้น เราใช้ RoundingMode.HALF_UP เพื่อกำหนดว่า ถ้าค่าที่ตามหลังมีค่าน้อยกว่า 5 ให้ปัดลง นอกนั้นปัดขึ้น และสุดท้ายเราใช้ HALF_EVEN จะทำการดูตัวก่อนหน้าตัวหนึ่ง ถ้ามีค่าเป็นจำนวนคู่จะปัดเศษทิ้ง แต่เมื่อเป็นจำนวนคี่จะปัดเศษขึ้น

Constructors ใน BigDecimal

มาดู Constructors กันบ้างครับ ตามด้านล่างเลยครับ
BigDecimal(BigInteger val)
BigDecimal(BigInteger unscaledVal, int scale)
BigDecimal(BigInteger val, MathContext mc)
BigDecimal(BigInteger val, MathContext mc)
BigDecimal(char[] in)
BigDecimal(char[] in, int offset, int len)
BigDecimal(char[] in, int offset, int len, MathContext mc)
BigDecimal(char[] in, MathContext mc)
BigDecimal(double val)
BigDecimal(double val, MathContext mc)
BigDecimal(int val)
BigDecimal(int val, MathContext mc))
BigDecimal(long val)
BigDecimal(long val, MathContext mc)
BigDecimal(String val)
BigDecimal(String val, MathContext mc)

ต่อไปมาดู method ต่าง ๆ ที่สำคัญกันครับ
import java.math.BigDecimal;

public class BigDecimalIndex {
    public static void main(String[] args) {
        BigDecimal first = new BigDecimal("1234124.23343");
        BigDecimal second = new BigDecimal("2.0");
        
        System.out.println(first.add(second));
        // output = 1234126.23343
        System.out.println(first.subtract(second));
        // output = 1234122.23343
        System.out.println(first.divide(second));
        // output = 617062.116715
        System.out.println(first.equals(second));
        // output = false
        System.out.println(first.abs());
        // output = 1234124.23343
        System.out.println(first.max(second));
        // output = 1234124.23343
        System.out.println(first.min(second));
        // output = 2.0
        System.out.println(first.remainder(second));
        // output = 0.23343
    }
}
ตัวอย่างนี้เราสร้าง Object BigDecimal ขึ้นมาสองตัวคือ first กับ second จากนั้นเราเรียก method add ก็คือการบวกกัน method subtract ก็คือการลบกัน divide ก็คือการหาร equals ก็คือการเปรียบเทียบการเท่ากัน abs คือการหาค่าสัมบูรณ์ max เปรียบเทียบค่ามาก min เปรียบเทียบค่าน้อย remainder ก็คือการหาเศษจากการหารหรือ mod นั่นเองครับ
import java.math.BigDecimal;

public class BigDecimalIndex {
    public static void main(String[] args) {
        String val = "23424123423423412313213234980101123274274.52";
        BigDecimal bd = new BigDecimal(val);
        
        double tod = bd.doubleValue();
        System.out.println(tod);
        // output = 2.342412342342341E40
        
        float tof = bd.floatValue();
        System.out.println(tof);
        // output = Infinity
    }
}
ส่วนตัวอย่างนี้ เพื่อให้ดูว่า Object BigDecimal มี method ที่เอาไว้แปลงเป็นค่า double หรือค่า float ได้ ครับ
comments