วิธีการปัดเศษตัวเลขเป็น N ทศนิยมตำแหน่งใน Java

1. ภาพรวม

ในบทความสั้น ๆ นี้เราจะมาดูวิธีการปัดเศษตัวเลขเป็นnตำแหน่งทศนิยมใน Java

2. เลขฐานสิบใน Java

Java ให้สองประเภทแบบดั้งเดิมที่สามารถนำมาใช้สำหรับการจัดเก็บตัวเลขทศนิยม: ลอยและคู่ Doubleเป็นประเภทที่ใช้โดยค่าเริ่มต้น:

double PI = 3.1415;

อย่างไรก็ตามไม่ควรใช้ทั้งสองประเภทสำหรับค่าที่แน่นอนเช่นสกุลเงิน สำหรับสิ่งนั้นและสำหรับการปัดเศษเราสามารถใช้คลาสBigDecimal

3. การจัดรูปแบบเลขฐานสิบ

หากเราต้องการพิมพ์ตัวเลขทศนิยมที่มีnหลักหลังจุดทศนิยมเราสามารถจัดรูปแบบสตริงเอาต์พุต:

System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // OUTPUTS: Value with 3 digits after decimal point 3.142

หรือเราสามารถจัดรูปแบบค่าด้วยคลาสDecimalFormat :

DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));

DecimalFormatช่วยให้เราสามารถกำหนดพฤติกรรมการปัดเศษได้อย่างชัดเจนทำให้สามารถควบคุมเอาต์พุตได้มากกว่าString.format () ที่ใช้ข้างต้น

4. การปัดเศษDouble s ด้วยBigDecimal

ในการปัดเศษทศนิยมสองถึงnตำแหน่งเราสามารถเขียนวิธีการช่วยเหลือ :

private static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); }

มีสิ่งหนึ่งที่สำคัญที่จะแจ้งให้ทราบล่วงหน้าในการแก้ปัญหานี้คือ - เมื่อสร้างBigDecimal ; เราจะต้องใช้เสมอBigDecimal (String)คอนสตรัค วิธีนี้ป้องกันปัญหาในการแสดงค่าที่ไม่ตรง

เราสามารถบรรลุสิ่งเดียวกันได้โดยใช้ไลบรารี Apache Commons Math:

 org.apache.commons commons-math3 3.5 

เวอร์ชันล่าสุดได้ที่นี่

เมื่อเพิ่มไลบรารีลงในโปรเจ็กต์แล้วเราสามารถใช้เมธอดPrecision.round ()ซึ่งใช้อาร์กิวเมนต์สองค่า - ค่าและขนาด:

Precision.round(PI, 3);

โดยค่าเริ่มต้นจะใช้วิธีการปัดเศษHALF_UPเดียวกับวิธีการช่วยเหลือของเรา ดังนั้นผลลัพธ์ควรจะเหมือนกัน

โปรดทราบว่าเราสามารถเปลี่ยนพฤติกรรมการปัดเศษได้โดยส่งวิธีการปัดเศษที่ต้องการเป็นพารามิเตอร์ที่สาม

5. การปัดเศษคู่ด้วยDoubleRounder

DoubleRounderเป็นยูทิลิตี้ในไลบรารี decimal4j เป็นวิธีที่รวดเร็วและปราศจากขยะในการปัดเศษทศนิยมสองเท่าจาก 0 ถึง 18 จุดทศนิยม

เราสามารถรับไลบรารีได้ (สามารถพบเวอร์ชันล่าสุดได้ที่นี่) โดยเพิ่มการอ้างอิงลงในpom.xml :

 org.decimal4j decimal4j 1.0.3 

ตอนนี้เราสามารถใช้:

DoubleRounder.round(PI, 3);

อย่างไรก็ตามDoubleRounderล้มเหลวในบางสถานการณ์ตัวอย่างเช่น:

System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 instead of expected 256.03

6. Math.round () วิธีการ

อีกวิธีหนึ่งในการปัดเศษตัวเลขคือการใช้ Math.Round () Method

ในกรณีนี้เราสามารถควบคุมnจำนวนตำแหน่งทศนิยมได้โดยการคูณและหารด้วย10 ^ n :

public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }

วิธีนี้ไม่แนะนำให้เป็นมันตัดทอนค่า ในหลาย ๆ กรณีค่าถูกปัดเศษอย่างไม่ถูกต้อง:

System.out.println(roundAvoid(1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // OUTPUTS: 260.77 instead of expected 260.78

ดังนั้นวิธีนี้จึงแสดงไว้ที่นี่เพื่อการเรียนรู้เท่านั้น

7. สรุป

ในบทช่วยสอนฉบับย่อนี้เราได้กล่าวถึงเทคนิคต่างๆในการปัดเศษตัวเลขเป็นทศนิยมnตำแหน่ง

เราสามารถจัดรูปแบบผลลัพธ์โดยไม่ต้องเปลี่ยนค่าหรือเราสามารถปัดเศษตัวแปรโดยใช้วิธีการช่วยเหลือ นอกจากนี้เรายังได้กล่าวถึงไลบรารีบางแห่งที่จัดการกับปัญหานี้

รหัสที่ใช้ในการสนทนาสามารถพบได้ใน GitHub