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