|
ไอที |
Java |
29543
รู้จักกับ 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 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 ได้ ครับ