1. บทนำสู่ BigDecimal
BigDecimal ประกอบด้วยค่าที่ไม่ใช่จำนวนเต็มของความแม่นยำใด ๆ และสเกลจำนวนเต็ม 32 บิต หากเป็นศูนย์หรือเป็นบวกสเกลคือจำนวนตัวเลขหลังจากจุดทศนิยม หากเป็นจำนวนลบให้คูณค่าที่ไม่ปรับขนาดของจำนวนด้วยกำลังมาตราส่วนลบที่ 10 ดังนั้นค่าที่แสดงโดย bigdecimal คือ ( unscaledValue × 10-scale )
2. การแนะนำ BigDecimal
เมื่อใช้ภาษาการเขียนโปรแกรม Java เช่นการธนาคารและการเงินที่ต้องการการคำนวณค่าตัวเลขที่มีความแม่นยำสูงเรามักจะใช้ BigDecimal และ BigInteger แทนที่จะเป็น int ทั่วไป long float และ double ประเภทโดยเฉพาะอย่างยิ่งเมื่อจัดการกับข้อมูลจุดลอยตัว
ก่อนอื่นมาดูการสาธิตรหัสของการใช้ประเภทข้อมูลพื้นฐาน double สำหรับการคำนวณและผลการพิมพ์:
คลาสสาธารณะ MainClass {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println (0.02+0.01); System.out.println (0.05+0.01); -ผลลัพธ์มีดังนี้:
0.030.0600000000000000000000005
คำถามคือทำไมข้อมูลที่มีผลลัพธ์ที่สองถึงปรากฏ? เหตุผลพื้นฐานคือคอมพิวเตอร์ของเราเป็นไบนารีและไบนารีไม่สามารถแสดงหมายเลขจุดลอยตัวได้อย่างถูกต้อง มีข้อผิดพลาดบางอย่างเมื่อ CPU ใช้วิธี "Mandrel และ Exponent" (วิธีสัญกรณ์ทางวิทยาศาสตร์) เพื่อแสดงหมายเลขจุดลอยตัว ดังนั้นเมื่อข้อกำหนดความแม่นยำของข้อมูลค่อนข้างสูงคลาส BigDecimal ยังคงต้องใช้แม้ว่าความเร็วการคำนวณจะช้าลงเล็กน้อย
3. การใช้งาน bigdecimal
มีสองวิธีในการสร้างวัตถุขนาดใหญ่: ตัวสร้างและวิธีการคงที่สาธารณะ ( BigDecimal.valueOf ) ต้องให้ความสนใจสองจุด:
1. ตัวสร้างมีสองรูปแบบที่ใช้ชนิดข้อมูลพื้นฐานและสตริงเป็นพารามิเตอร์ แนะนำหลังเช่น: new BigDecimal(Double.valueOf(0.09)) คุณสามารถลองได้ ผลลัพธ์ผลลัพธ์ของ System.out.println(new BigDecimal(0.06).toString()); คำแถลงคือ: 0.059999999999999999977779553950749686919152736663818359375
2. เมื่อทศนิยมพิมพ์บันทึกหรือแปลงเป็นประเภทข้อมูลพื้นฐานลองใช้วิธีการสาธารณะ xxxValue() ที่จัดทำโดยมันเช่น doubleValue() แทนที่จะเป็น toString()
4. โหมดการปัดเศษขนาดใหญ่
แม้ว่าฐานข้อมูลจะเก็บหมายเลขจุดลอยตัวที่มีความแม่นยำสูง แต่ก็จำเป็นที่จะต้อง จำกัด จำนวนตัวเลขทศนิยมเมื่อแสดงในแอปพลิเคชันเช่นทศนิยมสองถึงสาม ในเวลานี้คุณต้องใช้ฟังก์ชั่น setScale ( int newScale, int roundingMode ) ในฐานะที่เป็นตัวแปรคงที่สาธารณะของ BigDecimal มีกฎการดำเนินการมากมายสำหรับโหมดการปัดเศษ (โหมดการปัดเศษ) และมีแปดประเภทสาธารณะ นี่คือคำอธิบายและเอกสารอย่างเป็นทางการก็แนะนำ
1. round_up
ปัดห่างจากศูนย์ ละทิ้งส่วนที่ไม่ใช่ศูนย์และเพิ่มหนึ่งหมายเลขที่อยู่ติดกับส่วนที่ไม่ใช่ศูนย์
2. round_down
รอบในทิศทางใกล้กับศูนย์ ละทิ้งส่วนที่ไม่ใช่ศูนย์และในเวลาเดียวกันจำนวนชิ้นส่วนที่อยู่ติดกันจะไม่ถูกทิ้งโดยการเพิ่มส่วนหนึ่งลงในส่วนที่ไม่ใช่ศูนย์และสกัดกั้นพฤติกรรม
3. round_ceiling
รอบในทิศทางของอนันต์ หากเป็นจำนวนบวกผลลัพธ์การปัดเศษจะเหมือนกับ round_up; หากเป็นจำนวนลบผลลัพธ์การปัดเศษจะเหมือนกับ round_down หมายเหตุ: โหมดนี้ไม่ลดขนาดของค่า
4. Round_floor
รอบในทิศทางของอนันต์เชิงลบ หากเป็นจำนวนบวกผลลัพธ์การปัดเศษจะเหมือนกับ round_down; หากเป็นจำนวนลบผลการปัดเศษจะเหมือนกับ round_up หมายเหตุ: โหมดนี้ไม่เพิ่มขนาดของมูลค่า
5. round_half_up
การปัดเศษไปยังหมายเลข "ที่ใกล้เคียงที่สุด" คือโหมดการปัดเศษของการปัดเศษขึ้นหากระยะทางถึงสองหมายเลขที่อยู่ติดกันเท่ากับ หากชิ้นส่วนถูกทิ้ง> = 0.5 พฤติกรรมการปัดเศษจะเหมือนกับ round_up; มิฉะนั้นพฤติกรรมการปัดเศษจะเหมือนกับ round_down รูปแบบนี้เป็นสิ่งที่เรามักเรียกว่า "การปัดเศษ" ของเรา
6. Round_half_down
การปัดเศษไปยังหมายเลข "ที่ใกล้เคียงที่สุด" หากระยะทางถึงสองหมายเลขที่อยู่ติดกันเท่ากับเป็นโหมดการปัดเศษของการปัดเศษ หากส่วนที่ถูกทิ้ง> 0.5 พฤติกรรมการปัดเศษจะเหมือนกับ round_up; มิฉะนั้นพฤติกรรมการปัดเศษจะเหมือนกับ round_down โมเดลนี้เป็นสิ่งที่เรามักเรียกว่า "การปัดเศษ" ของเรา
7. Round_half_even
ปัดเศษไปยังหมายเลข "ใกล้เคียงที่สุด" หากระยะทางถึงสองหมายเลขที่อยู่ติดกันเท่ากับตัวเลขที่อยู่ติดกันจะถูกปัดเศษ หากหมายเลขคี่ทางด้านซ้ายของชิ้นส่วนถูกยกเลิกพฤติกรรมการปัดเศษจะเหมือนกับ round_half_up; หากเป็นตัวเลขคู่พฤติกรรมการปัดเศษจะเหมือนกับ round_half_down หมายเหตุ: โหมดการปัดเศษนี้จะช่วยลดข้อผิดพลาดการสะสมเมื่อการคำนวณซ้ำ ๆ โหมดการปัดเศษนี้เรียกว่า "วิธีการปัดเศษของนายธนาคาร" และส่วนใหญ่จะใช้ในสหรัฐอเมริกา รอบที่หกเป็นหกและห้าเป็นสองสถานการณ์ หากก่อนหน้านี้เป็นหมายเลขคี่มันจะเข้าสู่ตำแหน่งไม่เช่นนั้นจะถูกทอดทิ้ง
8. Round_unnecedary
การดำเนินการของคำขอยืนยันมีผลลัพธ์ที่แม่นยำดังนั้นจึงไม่จำเป็นต้องมีการปัดเศษ หากมีการระบุโหมดการปัดเศษนี้สำหรับการดำเนินการที่ได้รับผลลัพธ์ที่แน่นอน
ด้านล่างให้ตัวอย่างเพื่อแสดงผลการคำนวณเชิงตัวเลขในโหมดการปัดเศษที่แตกต่างกันโดยรักษาทศนิยมหนึ่งทศนิยม:
5. สรุป
ข้างต้นคือการแนะนำทั้งหมดของ BigDecimal และแปดโหมดการปัดเศษของ Java ฉันหวังว่าเนื้อหาของบทความนี้จะเป็นประโยชน์กับทุกคนในการเรียนรู้ Java