การใช้ java.math.BigDecimal
รู้จักกับ java.math.BigDecimal และการใช้งานต่าง ๆ
BigDecimal เป็นคลาส หนึ่ง ในคลาสมาตรฐานของ java ซึ่งอยู่ใน java.math.BigDecimalDecimal ก็คือจำนวนทศนิยม 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 BigDecimal | ONE |
static int | ROUND_CEILING |
static int | ROUND_DOWN |
static int | ROUND_FLOOR |
static int | ROUND_HALF_DOWN |
static int | ROUND_HALF_EVEN |
static int | ROUND_HALF_UP |
static int | ROUND_UNNECESSARY |
static int | ROUND_UP |
static BigDecimal | TEN |
static BigDecimal | ZERO |
มาดูตัวอย่างกันครับ
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 ได้ ครับ