JavaRush /จาวาบล็อก /Random-TH /การปัดเศษตัวเลขในภาษา Java

การปัดเศษตัวเลขในภาษา Java

เผยแพร่ในกลุ่ม
ตัวเลขทศนิยม (ทศนิยม, สองเท่า) ใช้ในการคำนวณนิพจน์ที่ต้องการความแม่นยำของทศนิยม มักจำเป็นต้องมีความแม่นยำสูงในการบัญชีและการดำเนินการด้านคอมพิวเตอร์อื่นๆ การปัดเศษตัวเลขใน Java - 1แต่เราต้องการตัวเลขที่ยาวหลังจุดทศนิยมเสมอไปหรือไม่? บางทีความแม่นยำของส่วนจริงสามส่วนก็เพียงพอสำหรับเราแล้ว? และเราพอใจกับตัวเลือกนี้ จะทำการปัดเศษอย่างถูกต้องได้อย่างไร? นี่คือสิ่งที่เราจะพูดถึงในวันนี้: เราจะดูวิธีปัดเศษตัวเลขใน Java

รูปแบบสตริง

สำหรับวิธีแรก เราจะดูการปัดเศษเป็นสองเท่า:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
ด้วยเหตุนี้ เราจะจัดรูปแบบจุดลอยตัวของเรา 34766674 ด้วยความแม่นยำของทศนิยม 3 ตำแหน่งเนื่องจากในคำแนะนำการจัดรูปแบบเราได้ระบุทศนิยมสามตำแหน่ง "%.3f" ในทางกลับกัน %f เมื่อจัดรูปแบบสตริงจะระบุประเภทของจุดลอยตัว ซึ่งรวมประเภทข้อมูลdoubleและfloatใน Java ในตัวอย่างด้านบน เราส่งออกค่าผลลัพธ์ไปยังคอนโซล คำถามคือ เราจะย่อให้สั้นลงได้อย่างไร ง่ายมาก: คุณต้องใช้ printf ซึ่งในทางกลับกัน คือรูปแบบ + พิมพ์ ด้วยเหตุนี้ตัวอย่างของเราก่อนหน้านี้จึงลดลงเป็น:
double value = 34.766674;
System.out.printf("%.3f",value);
นอกจากวิธีนี้แล้ว อินสแตนซ์ภายนอกของ คลาส PrintStreamยังมีวิธีการจัดรูปแบบ ซึ่งทำงานในลักษณะเดียวกัน:
double value = 34.766674;
System.out.format("%.3f",value);
การปัดเศษเกิดขึ้นใน โหมดHALF_UP - ไปสู่ตัวเลขที่ใกล้กับตัวเลขที่ถูกตัดออก (ถึง 0 หรือ 10) หากตัวเลขเหล่านี้มีระยะห่างเท่ากัน (ในกรณีของ 5) ระบบจะทำการปัดเศษขึ้น ตัวอย่าง:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
เราจะหารือเกี่ยวกับโหมดการปัดเศษโดยละเอียดด้านล่าง การปัดเศษตัวเลขใน Java - 2

รูปแบบทศนิยม

อีกทางเลือกหนึ่ง คือการใช้ คลาส DecimalFormat ได้รับการออกแบบมาเพื่อจัดรูปแบบตัวเลขใดๆ ใน Java ไม่ว่าจะเป็นจำนวนเต็มหรือตัวเลขทศนิยม เมื่อเราสร้างอินสแตนซ์DecimalFormatเราสามารถส่งผ่านสตริงรูปแบบได้ มันจะระบุจำนวนตำแหน่งทศนิยมที่จะจัดรูปแบบสำหรับอินพุต นี่คือลักษณะของตัวอย่างของเราโดยใช้DecimalFormat :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
บรรทัด#.###เป็นรูปแบบที่ระบุว่าเรากำลังจัดรูปแบบค่าที่ส่งเป็นทศนิยม 3 ตำแหน่ง หากต้องการเปลี่ยนรูปแบบหลังจากสร้างออบเจ็กต์ DecimalFormat คุณสามารถใช้เมธอดApplyPatternและApplyLocalizedPattern :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
แต่วันนี้เราจะพูดถึงเรื่องการปัดเศษใช่ไหม? เมื่อตัดทอนตัวเลขที่มีตำแหน่งทศนิยมเกินรูปแบบที่ระบุDecimalFormatจะปัดเศษตัวเลขขึ้นหากตัวเลขที่ตัดทอนสุดท้ายมากกว่า 5 แต่จะเกิดอะไรขึ้นถ้าตัวเลขคือ 5? ปรากฎว่ามันอยู่ตรงกลางระหว่างจำนวนเต็มที่ใกล้ที่สุดพอดี แล้วไงล่ะ? ในกรณีนี้จะพิจารณาหมายเลขก่อนหน้าด้วย ถ้าเป็นคู่ การปัดเศษจะเสร็จสิ้น:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
หากเป็นเลขคี่ จะไม่ดำเนินการ:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
มีความแตกต่างเล็กน้อยระหว่างการจัดรูปแบบตัวเลขทศนิยมโดยใช้ String.format() และ DecimalFormat.format() อันแรกจะพิมพ์เลขศูนย์ต่อท้ายเสมอแม้ว่าจะไม่มีส่วนที่เป็นเศษส่วนก็ตาม เช่น:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
ดังที่เราเห็น เมื่อจัดรูปแบบตัวเลข 7.000132 เป็นทศนิยมสามตำแหน่ง เมธอด format() ของ String จะส่งออกเป็น 7.000 ในขณะที่เมธอด format() ของ DecimalFormat จะส่งออกเป็น 7 กล่าวคือ คุณสามารถเลือกString.format()หรือDecimalFormat. format( )ขึ้นอยู่กับว่าคุณต้องการศูนย์ต่อท้ายหรือไม่ ด้วยวิธีการที่อธิบายไว้ข้างต้น เราได้รับผลลัพธ์ในรูปแบบของสตริง มาดูวิธีคืนค่าตัวเลขให้ตรงกันกัน

คณิตศาสตร์

เป็นไปไม่ได้ที่จะไม่พูดถึงคลาสพิเศษที่ออกแบบมาสำหรับการดำเนินการทางคณิตศาสตร์ต่างๆ ด้วยตัวเลข- คณิตศาสตร์ การปัดเศษตัวเลขใน Java - 3คลาสนี้ยังมีวิธีการปัดเศษด้วย แต่ไม่เหมือนกับที่อธิบายไปแล้ว คลาสนี้ไม่อนุญาตให้คุณตั้งค่าตำแหน่งทศนิยมจำนวนหนึ่ง แต่จะปัดเศษเป็นจำนวนเต็ม:
  • Math.ceil()ปัดเศษขึ้นเป็นจำนวนเต็มที่ใกล้ที่สุด แต่ส่งคืนไม่ใช่ประเภทจำนวนเต็ม แต่กลับเป็นสองเท่า:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    แม้ว่าเราจะมี 34.0000000 แต่หลังจากใช้Math.ceilเราก็จะยังคงได้รับ 35.0

    Math.floor() ปัดเศษลงเป็นจำนวนเต็มที่ใกล้ที่สุด และส่งคืนผลลัพธ์เป็นสองเท่า:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    ขอย้ำอีกครั้ง แม้ว่าเราจะมีค่า 34.999999999 แต่หลังจากใช้Math.floorเราก็จะได้ 34.0

  • Math.round () - ปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด โดยให้ผลลัพธ์ int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    ถ้าเลขของเราคือ 34.5 จะถูกปัดเศษเป็น 35 แต่ถ้าน้อยกว่า 34.499 เล็กน้อย ตัวเลขจะถูกปัดเศษเป็น 34

    เพื่อไม่ให้ตัดส่วนจริงทั้งหมดออก แต่เพื่อควบคุมกระบวนการนี้ให้เป็นทศนิยมจำนวนหนึ่งและในเวลาเดียวกัน ตัวเลขจะถูกคูณด้วย 10^n (10 ยกกำลัง n) โดยที่ n เท่ากับจำนวนตำแหน่งทศนิยมที่จำเป็น หลังจากนี้ วิธีการบางอย่างของ คลาส Math จะถูกใช้ เพื่อปัดเศษ แล้วหารด้วย 10^n อีกครั้ง:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - รับสองข้อโต้แย้ง อันแรกคือตัวเลข อย่างที่สองคือพลังที่ต้องยกระดับ

การปัดเศษด้วย BigDecimal

BigDecimalเป็นคลาสที่ให้คุณทำงานกับตัวเลขทศนิยมได้ โดยเฉพาะอย่างยิ่ง คุณสมบัติหลักของมันคือสามารถจัดเก็บตัวเลขเศษส่วนที่มีความยาวตามใจชอบได้ (นั่นคือ ไม่มีการจำกัดช่วงของตัวเลข) นอกจากนี้ คลาสนี้ยังจัดเก็บวิธีการต่างๆ สำหรับการประมวลผลทางคณิตศาสตร์ รวมถึงการปัดเศษ คลาสของอ็อบเจ็กต์นี้สามารถสร้างได้โดยการตั้งค่า Constructor เป็นสองเท่า สตริงเพื่อแสดงตัวเลขทศนิยม double และMathContextและอื่นๆ MathContextคือการรวมกันของRoundingModeและตัวเลขที่อธิบายจำนวนหลักทั้งหมดในค่าที่ค้นหา กฎการปัดเศษ RoundingMode: DOWN - การปัดเศษเข้าหาศูนย์ ขึ้น - ปัดเศษจากโหมดศูนย์ CEILING - ปัดเศษไปทางบวกอนันต์ FLOOR - ปัดเศษไปทางลบอนันต์ HALF_UP - ปัดเศษเป็น "เพื่อนบ้านที่ใกล้ที่สุด" หากเพื่อนบ้านทั้งสองมีระยะห่างไม่เท่ากัน (นั่นคือ เมื่อจำนวนที่ถูกปัดเศษคือ 5) ในกรณีนี้ จะมีการปัดเศษขึ้น HALF_DOWN - ปัดไปทาง "เพื่อนบ้านที่ใกล้ที่สุด" หากเพื่อนบ้านทั้งสองมีระยะห่างไม่เท่ากัน ในกรณีนี้ ให้ปัดเศษลง HALF_EVEN - ปัดเศษเป็น "เพื่อนบ้านที่ใกล้ที่สุด" หากเพื่อนบ้านทั้งสองมีระยะห่างไม่เท่ากัน ในกรณีนี้ ให้ปัดเศษเป็นเลขคู่ (ดังที่อธิบายไว้ใน DecimalFormat ข้างต้น) ไม่จำเป็น - ใช้เพื่อยืนยันว่าการดำเนินการที่ร้องขอมีผลลัพธ์ที่ถูกต้อง ดังนั้นจึงไม่จำเป็นต้องปัดเศษ ตัวอย่าง:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
นอกจากความสามารถในการตั้งค่ากฎการปัดเศษในตัวสร้างแล้วBigDecimalยังช่วยให้คุณตั้งค่าโหมดการปัดเศษหลังจากสร้างอินสแตนซ์แล้ว เมื่อต้องการทำเช่นนี้ ให้ใช้ เมธอด setScaleซึ่งคุณต้องกำหนดจำนวนตำแหน่งทศนิยมและกฎการปัดเศษ:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal ยังมี ตัวแปร int ภายใน ที่ออกแบบมาเพื่อตั้งค่าโหมดการปัดเศษ ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ... ) สิ่งเหล่านี้แสดงถึงกฎการปัดเศษที่คล้ายคลึงกับที่แสดงใน คลาส RoundingModeและใช้ในทำนองเดียวกันในsetScale :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
อ่านเพิ่มเติมเกี่ยวกับคลาส BigDecimal ในบทความ นี้
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION