บทนำสู่ BigDecimal
คำอธิบายในเอกสาร JDK (จีน) มีดังนี้:
ไม่เปลี่ยนรูปแบบทศนิยมที่ลงนามในความแม่นยำโดยพลการ BigDecimal ประกอบด้วยค่าที่ไม่ใช่จำนวนเต็มของความแม่นยำใด ๆ และสเกลจำนวนเต็ม 32 บิต หากเป็นศูนย์หรือเป็นบวกสเกลคือจำนวนตัวเลขหลังจากจุดทศนิยม หากเป็นจำนวนลบให้คูณค่าที่ไม่ปรับขนาดของจำนวนด้วยกำลังมาตราส่วนลบที่ 10 ดังนั้นค่าที่แสดงโดย bigdecimal คือ (unscaledValue × 10 ระดับ)
คำอธิบายเฉพาะ
1. "ค่าของวัตถุขนาดใหญ่ที่ไม่เปลี่ยนรูป" สิ่งนี้แสดงคุณสมบัตินี้ในฟังก์ชั่นการทำงานของวัตถุขนาดใหญ่:
การคัดลอกรหัสมีดังนี้: bigdecimal a = new bigdecimal ("1.22");
System.out.println ("สร้างด้วยค่าสตริง:" + a);
bigdecimal b = ใหม่ bigdecimal ("2.22");
a.add (b);
System.out.println ("a plus b คือ:" + a);
เป็นเรื่องง่ายที่จะคิดว่ามันจะส่งออก:
สร้างด้วย StringValue: 1.22
A Plus B คือ: 3.44
แต่ในความเป็นจริง A Plus B คือ: 1.22
2. "BigDecimal ประกอบด้วยค่าที่ไม่ใช่จำนวนเต็มของความแม่นยำใด ๆ และสเกลจำนวนเต็ม 32 บิตหากค่าสเกลเป็นศูนย์หรือบวกสเกลคือจำนวนตัวเลขหลังจากจุดทศนิยม" ประโยคนี้สามารถอ่านได้เช่นนี้:
ตัวอย่างเช่น: -12 และ 13.412
แสดงเป็น: -12 × 10-0 และ 13412 × 10-3
ที่นี่ (ค่าที่ไม่ใช่การปรับขนาดและเครื่องชั่ง) แสดงเป็น: [-12, 0] และ [13412, 3] ตามลำดับ
3. "หากค่าสเกลเป็นจำนวนลบให้คูณค่าที่ไม่ได้ของจำนวนด้วยกำลังมาตราส่วนลบ 10" ประโยคนี้สามารถอ่านได้เช่นนี้:
ตัวอย่างเช่น: 120.00
ค่านี้แสดงเป็น: 12000 × 10-2
ที่นี่ (ค่าและขนาดที่ไม่ใช่ขนาด) แสดงเป็น: [12000, 2]
ค่าของมาตราส่วนที่นี่ยังคงเป็นบวก 2 แต่ดำเนินการต่อไปนี้:
BigDecimal จำนวน = new BigDecimal ("-120.00");
// ส่งคืนตัวเลขขนาดใหญ่เท่ากับทศนิยมนี้ แต่จะลบศูนย์หางทั้งหมดออกจากการเป็นตัวแทนนี้
จำนวน = จำนวนเงิน striptrailingzeros ();
ค่านี้แสดงเป็น: 12 × 10-(-1)
ที่นี่ (ค่าและขนาดที่ไม่ใช่ขนาด) แสดงเป็น: [12, -1]
หมายเหตุเกี่ยวกับการใช้
1. ตัวสร้าง
การคัดลอกรหัสมีดังนี้: bigdecimal adouble = ใหม่ bigdecimal (1.22);
System.out.println ("สร้างด้วยค่าคู่:" + adouble);
Abtring BigDecimal = ใหม่ BigDecimal ("1.22");
System.out.println ("สร้างด้วยค่าสตริง:" + Abtring);
ผลลัพธ์ผลลัพธ์มีดังนี้:
สร้างด้วย doublevalue: 1.21999999999999999999733546474089962430298328399658203125
สร้างด้วยค่าสตริง: 1.22
คำอธิบายของ JDK:
a) ผลลัพธ์ของวิธีการก่อสร้างด้วยพารามิเตอร์ประเภทสองเท่านั้นไม่สามารถคาดเดาได้ บางคนอาจคิดว่า bigdecimal ที่สร้างขึ้นโดยการเขียน newbigdecimal (0.1) ใน Java เท่ากับ 0.1 (ค่าที่ไม่ใช่การปรับขนาด 1 ซึ่งมีขนาด 1) แต่จริง ๆ แล้วเท่ากับ 0.1000000000000000000000555511151231257827021181818181818 นี่เป็นเพราะ 0.1 ไม่สามารถแสดงได้อย่างถูกต้องเป็นสองเท่า (หรือสำหรับกรณีนี้ไม่สามารถแสดงเป็นทศนิยมไบนารีความยาว จำกัด ใด ๆ ) ด้วยวิธีนี้ค่าที่ส่งผ่านเข้าไปในวิธีการก่อสร้างจะไม่เท่ากับ 0.1 (แม้ว่าจะเป็นพื้นผิวเท่ากับค่านั้น)
b) ในทางกลับกันตัวสร้างสตริงสามารถคาดการณ์ได้อย่างสมบูรณ์: การเขียนไปยัง newbigdecimal ("0.1") จะสร้าง bigdecimal ซึ่งเป็น 0.1 ที่คาดหวัง ดังนั้นในการเปรียบเทียบโดยทั่วไปแนะนำให้ใช้สตริงคอนสตรัคเตอร์ก่อน
c) เมื่อต้องใช้สองครั้งเป็นแหล่งสำหรับ bigdecimal โปรดทราบว่าตัวสร้างนี้ให้การแปลงที่แม่นยำ มันไม่ได้ให้ผลลัพธ์เช่นเดียวกับ: ก่อนอื่นใช้วิธี double.toString (double) จากนั้นใช้ตัวสร้าง BigDecimal (String) ในการแปลงสตริงเป็นสองเท่าคุณยังสามารถใช้วิธีการคงที่ของสตริง: String.ValueOf (สองเท่า)
2. การดำเนินการ นอกจากนี้การลบการคูณและการหารจริงจะส่งคืนวัตถุขนาดใหญ่ใหม่เพราะ BigDecimal ไม่เปลี่ยนรูปและวัตถุใหม่จะถูกสร้างขึ้นเมื่อทำการดำเนินการแต่ละขั้นตอนดังนั้น A.Add (B); แม้ว่าการดำเนินการเพิ่มเติมจะดำเนินการ แต่ A ไม่ได้บันทึกค่าหลังจากการดำเนินการเพิ่มเติม การใช้งานที่ถูกต้องควรเป็น A = a.add (b);
ตัวอย่าง:
ตรวจสอบว่าวัตถุขนาดใหญ่เป็นจำนวนเต็มหรือไม่:
คัดลอกรหัสดังนี้: บูลีนส่วนตัว isintegerValue (BigDecimal BD) {
ส่งคืน bd.signum () == 0 || bd.scale () <= 0 || bd.striptrailingzeros (). scale () <= 0;
-
ทำไมถึงทำเช่นนี้? โปรดทดสอบตัวอย่างต่อไปนี้:
คัดลอกรหัสดังต่อไปนี้: BigDecimal จำนวน = New BigDecimal ("-120.00"); // โปรดลอง "0", "0.00", "1.00", "10.00" และ "10.10" ตามลำดับ
System.out.println (จำนวน signum ()); // บวกและลบ
System.out.println (จำนวน sscale ()); //มาตราส่วน
System.out.println (จำนวน striptrailingzeros (). scale ()); // scale หลังจาก zeroing
การอ้างอิง: คลาส BigDecimal