Apakah mungkin melakukan transmisi dengan presisi di java tanpa menggunakan printf yang diformat? [duplikat]

Baris ini menghasilkan nilai ganda 3.33333333335

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

Apakah mungkin untuk mengatur lebar dengan presisi?


person drac_o    schedule 13.03.2020    source sumber
comment
Apakah ini menjawab pertanyaan Anda? printf %f dengan hanya 2 angka setelah koma desimal?   -  person Amongalen    schedule 13.03.2020
comment
itu bukan pemeran. Ini adalah cetakan   -  person jhamon    schedule 13.03.2020
comment
Tidak, presisinya ditetapkan dengan ganda. Itu sebabnya Anda perlu memformatnya jika Anda menginginkan representasi yang berbeda.   -  person Kayaman    schedule 13.03.2020
comment
@Amongalen itu mungkin dengan metode printf, tapi saya bertanya-tanya apakah itu dengan print   -  person drac_o    schedule 13.03.2020
comment
Ini bukan. Itulah salah satu alasan printf ada, untuk memungkinkan keluaran yang diformat.   -  person Kayaman    schedule 13.03.2020


Jawaban (3)


Anda dapat menggunakan DecimalFormat atau BigDecimal sebagai berikut:

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));
    }
}

Keluaran:

3.33
3.33
3.33
person Arvind Kumar Avinash    schedule 13.03.2020
comment
Daripada potensi kehilangan presisi saat melewati double, gunakan BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP). Anda sekarang dapat melampaui presisi double, mis. dengan 25 desimal, menghasilkan 3.3333333333333333333333333, dan melewati double akan menghasilkan 3.3333333333333335000000000. - person Andreas; 13.03.2020

Cetak hasil String.format(String, Object...) (yang sama dengan printf dengan langkah tambahan), atau gunakan BigDecimal (jika Anda menginginkan tipe dengan presisi sewenang-wenang).

person Elliott Frisch    schedule 13.03.2020

Salah satu solusinya adalah dengan menulis fungsi:

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

Sekarang Anda dapat menggunakannya:

System.out.println("Average marks of " + name + " = " + roundWithTwoDigits((double) sum / 7));
person vbezhenar    schedule 13.03.2020
comment
Saya rasa ini tidak akan berhasil untuk jumlah yang sangat besar, bukan? - person Amongalen; 13.03.2020
comment
Yap, untuk bilangan yang sangat besar sebaiknya menggunakan BigDecimals. Ini lebih untuk menjawab pertanyaan bagaimana cara mendapatkan angka presisi dua digit tanpa memformat. Itu mungkin, tapi itu pasti terbatas dan pemformatan harus digunakan untuk memformat atau BigDecimal harus digunakan untuk mengontrol presisi. - person vbezhenar; 13.03.2020