Format Float ke n tempat desimal

220

Saya perlu memformat float ke tempat desimal "n".

sedang mencoba ke BigDecimal, tetapi nilai kembali tidak benar ...

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}

Saya perlu mengembalikan nilai float dengan jumlah tempat desimal yang saya tentukan.

Saya perlu Floatpengembalian nilai bukanDouble

.

seba123neo
sumber

Jawaban:

561

Anda juga dapat melewati nilai float, dan menggunakan:

String.format("%.2f", floatValue);

Dokumentasi

Arve
sumber
70
Harap berhati-hati karena String.format bergantung pada konfigurasi lokal Anda saat ini, Anda mungkin tidak mendapatkan titik sebagai pemisah. Lebih suka menggunakanString.format(java.util.Locale.US,"%.2f", floatValue);
Gomino
6
jawaban ini memberikan nilai String, bukan nilai Float, saya tidak berpikir jawaban yang bagus.
ZhaoGang
3
Mengapa Anda memaksakan titik sebagai pemisah?
Mark Buikema
1
@ MarkBuikema Saya pikir ada kasus di mana itu akan sangat diperlukan, seperti ketika mengkompilasi format dokumen yang didorong oleh standar, misalnya. Dokumen PDF.
Tjaart
39

Lihatlah DecimalFormat . Anda dapat dengan mudah menggunakannya untuk mengambil nomor dan memberinya sejumlah tempat desimal.

Edit : Contoh

Nick Campion
sumber
1
+1. Inilah dokumentasi khusus Android , yang pada dasarnya harus sama.
Zach L
tapi saya butuh hasilnya adalah angka float, bukan string.
seba123neo
Apakah Anda mengatakan Anda ingin mengitari pelampung? Biasanya satu-satunya ketepatan waktu masalah float adalah untuk ditampilkan.
Nick Campion
maaf, Anda benar, saya bingung, hanya memformat nomor ketika ditampilkan di layar, bukan sebelumnya, itu pertanyaan saya, terima kasih banyak, masalah diselesaikan.
seba123neo
Sebagai catatan, penggunaan DecimalFormatkonstruktor tidak disarankan, lihat jawaban saya untuk penggunaan yang benar NumberFormat.
FBB
17

Coba ini, ini banyak membantu saya

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);

Hasilnya akan menjadi RoundfinalPrice -> 5652.26

Anupam
sumber
2
Ini lebih berguna bagi mereka yang mencari untuk menyelesaikan dan melakukan perhitungan lebih lanjut dengannya, jika tidak, jawaban Arve mungkin yang terbaik.
Gerard
Ini bekerja dengan GWT juga. String.format () - tidak.
AlexV
15

Dari catatan, penggunaan DecimalFormatkonstruktor tidak disarankan. Javadoc untuk kelas ini menyatakan:

Secara umum, jangan panggil konstruktor DecimalFormat secara langsung, karena metode pabrik NumberFormat dapat mengembalikan subkelas selain dari DecimalFormat.

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

Jadi yang perlu Anda lakukan adalah (misalnya):

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));
FBB
sumber
Ini tidak berfungsi ketika (misalnya) floatValue = 8.499. Itu memberi 8.5.
Shiva krishna Chippa
3
@ShivakrishnaChippa: ya, karena di sini kami menentukan bahwa kami ingin 2 digit setelah koma, dan untuk melakukan pembulatan ke atas. Jika demikian, 8.499 dibulatkan menjadi 8.5. Jika Anda ingin 8.499 ditampilkan, cukup tetapkan 3 sebagai digit pecahan maksimum.
FBB
6

Berikut adalah contoh cepat menggunakan DecimalFormatkelas yang disebutkan oleh Nick.

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

Output dari pernyataan cetak adalah 12,35. Perhatikan bahwa itu akan membulatkannya untuk Anda.

Tony L.
sumber
Sebagai catatan, penggunaan DecimalFormatkonstruktor tidak disarankan, lihat jawaban saya untuk penggunaan yang benar NumberFormat.
FBB
5

Agak terkejut tidak ada yang menunjukkan cara langsung untuk melakukannya, yang cukup mudah.

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}

Cukup yakin ini tidak melakukan pembulatan setengah-setengah sekalipun.

Untuk apa nilainya, pembulatan setengah-setengah akan menjadi kacau dan tidak dapat diprediksi setiap kali Anda mencampur nilai-nilai floating-point berbasis biner dengan aritmatika basis-10. Saya cukup yakin itu tidak bisa dilakukan. Masalah dasarnya adalah bahwa nilai seperti 1,105 tidak dapat direpresentasikan dengan tepat di floating point. Nilai floating point akan menjadi sekitar 1,105000000000001, atau 1,104999999999999. Jadi setiap upaya untuk melakukan pembulatan genap akan naik pada kesalahan pengkodean representasional.

Implementasi floating point IEEE akan melakukan pembulatan setengah, tetapi mereka melakukan pembulatan biner, bukan pembulatan setengah desimal. Jadi kamu mungkin baik-baik saja

Robin Davies
sumber
Saya juga telah menggunakan metode ini untuk sementara waktu, tetapi saya akan berpikir bahwa itu powadalah operasi yang terlalu mahal untuk digunakan untuk pembulatan?
Xerus
Jangan pernah mengoptimalkan sampai Anda benar-benar memiliki masalah kinerja. Lebih penting untuk menjadi benar daripada cepat. Dan saya tidak dapat dengan jujur ​​membayangkan sebuah aplikasi di mana kinerja pembulatan terkontrol akan menjadi masalah, kecuali jika Anda Visa atau Mastercard (yang hanya akan melemparkan lebih banyak mesin ke sana). Dan pow () mungkin lebih cepat daripada round ().
Robin Davies
2
public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }
M. Usman Khan
sumber
2

Ini adalah cara yang jauh lebih tidak profesional dan jauh lebih mahal tetapi harus lebih mudah dipahami dan lebih bermanfaat bagi pemula.

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}
Ethan Johnson
sumber
1

Saya pikir apa yang Anda inginkan ist

return value.toString();

dan gunakan nilai balik untuk ditampilkan.

value.floatValue();

akan selalu mengembalikan 625.3 karena ini terutama digunakan untuk menghitung sesuatu.

n3utrino
sumber
tapi saya butuh hasilnya adalah angka float, bukan string.
seba123neo
2
jika Anda membutuhkan pelampung untuk menunjukkannya kepada pengguna, mungkin ada yang salah dengan desain aplikasi. Biasanya float digunakan untuk menghitung dan string digunakan untuk menunjukkannya kepada pengguna.
n3utrino
maaf, Anda benar, saya bingung, hanya memformat nomor ketika ditampilkan di layar, bukan sebelumnya, itu pertanyaan saya, terima kasih banyak, masalah diselesaikan.
seba123neo
1

Saya mencari jawaban untuk pertanyaan ini dan kemudian saya mengembangkan metode! :) Peringatan yang adil, itu mengumpulkan nilai.

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
Blogger
sumber