เป็นไปได้ไหมที่จะส่งด้วยความแม่นยำใน java โดยไม่ใช้ printf ที่จัดรูปแบบแล้ว? [ทำซ้ำ]

บรรทัดนี้ส่งผลให้มีค่าสองเท่า 3.33333333335

System.out.println("Average marks of " + name + " = " + (double)sum/3);

สามารถกำหนดความกว้างของความแม่นยำได้หรือไม่?


person drac_o    schedule 13.03.2020    source แหล่งที่มา
comment
สิ่งนี้ตอบคำถามของคุณหรือไม่? printf %f มีตัวเลขเพียง 2 หลักหลังจุดทศนิยม?   -  person Amongalen    schedule 13.03.2020
comment
มันไม่ใช่นักแสดง มันเป็นงานพิมพ์   -  person jhamon    schedule 13.03.2020
comment
ไม่ ความแม่นยำได้รับการแก้ไขเป็นสองเท่า นั่นเป็นสาเหตุว่าทำไมคุณต้องจัดรูปแบบมันหากต้องการนำเสนอแบบอื่น   -  person Kayaman    schedule 13.03.2020
comment
@ Amongalen เป็นไปได้ด้วยวิธี printf แต่ฉันสงสัยว่ามันใช้กับ print หรือไม่   -  person drac_o    schedule 13.03.2020
comment
มันไม่ใช่. นั่นเป็นเหตุผลหนึ่งที่ printf มีอยู่เพื่อให้สามารถจัดรูปแบบเอาต์พุตได้   -  person Kayaman    schedule 13.03.2020


คำตอบ (3)


คุณสามารถใช้ DecimalFormat หรือ BigDecimal ได้ดังนี้:

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class Main {
    public static void main(String[] args) {
        int sum = 10;
        DecimalFormat decimalFormat = new DecimalFormat("#.##");
        System.out.println(Double.valueOf(decimalFormat.format((double) sum / 3)));

        // Another way
        System.out.println(new BigDecimal(String.valueOf((double) sum / 3)).setScale(2, RoundingMode.HALF_UP));

        // The better way using BigDecimal - thanks to @Andreas
        System.out.println(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP));
    }
}

เอาต์พุต:

3.33
3.33
3.33
person Arvind Kumar Avinash    schedule 13.03.2020
comment
แทนที่จะสูญเสียความแม่นยำที่อาจเกิดขึ้นเมื่อผ่าน double ให้ใช้ BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP) ตอนนี้คุณสามารถเกินความแม่นยำของ double เช่น มีทศนิยม 25 ตำแหน่ง ให้กลายเป็น 3.3333333333333333333333333 โดยที่ทะลุ double จะได้ผลลัพธ์เป็น 3.3333333333333335000000000 - person Andreas; 13.03.2020

พิมพ์ผลลัพธ์ของ String.format(String, Object...) (ซึ่งเหมือนกับ printf ที่มีขั้นตอนเพิ่มเติม) หรือใช้ BigDecimal (หากคุณต้องการประเภทที่มีความแม่นยำตามอำเภอใจ)

person Elliott Frisch    schedule 13.03.2020

ทางออกหนึ่งคือการเขียนฟังก์ชัน:

static double roundWithTwoDigits(double x) {
    return (double) Math.round(x * 100) / 100;
}

ตอนนี้คุณสามารถใช้มันได้:

System.out.println("Average marks of " + name + " = " + roundWithTwoDigits((double) sum / 7));
person vbezhenar    schedule 13.03.2020
comment
ฉันไม่คิดว่ามันจะใช้ได้ผลกับตัวเลขจำนวนมากจริงๆ ใช่ไหม? - person Amongalen; 13.03.2020
comment
ใช่แล้ว สำหรับตัวเลขที่มากจริงๆ เราควรใช้ BigDecimals เป็นการตอบคำถามมากกว่าว่าจะรับตัวเลขสองหลักที่แม่นยำโดยไม่ต้องจัดรูปแบบได้อย่างไร เป็นไปได้ แต่มีข้อจำกัดอย่างแน่นอน และควรใช้การจัดรูปแบบเพื่อจัดรูปแบบ หรือใช้ BigDecimal เพื่อควบคุมความแม่นยำ - person vbezhenar; 13.03.2020