Bagaimana cara memotong dua tempat desimal menjadi hanya dua di Jawa?

98

Misalnya saya memiliki variabel 3.545555555, yang ingin saya potong menjadi hanya 3.54.

Johnny
sumber
21
Ini BUKAN duplikat. Pemotongan dan pembulatan adalah dua hal yang sangat berbeda.
markthegrea
Setuju, tidak tahu mengapa ini ditandai sebagai duplikat.
Bassinator

Jawaban:

147

Jika Anda menginginkannya untuk tujuan tampilan, gunakan java.text.DecimalFormat:

 new DecimalFormat("#.##").format(dblVar);

Jika Anda membutuhkannya untuk perhitungan, gunakan java.lang.Math:

 Math.floor(value * 100) / 100;
Bozho
sumber
50
Ini tidak akan menampilkan 3,545555555 terpotong menjadi 3,54, tetapi dibulatkan menjadi 3,55. DecimalFormat.setRoundingMode () perlu disetel ke RoundingMode.FLOOR;
Christian García
9
ini tidak berhasil untuk saya Math.floor (9,62 * 100) / 100 menghasilkan 9,61
Mani
4
Menggunakan flooruntuk memotong hanya berfungsi untuk nilai positif.
Dev
4
@ ChristianGarcía Pemotongan dilakukan dengan benar RoundingMode.DOWNseperti RoudingMode.FLOORbiasa berputar menuju tak terhingga negatif.
Dev
46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

Periksa tersedia RoundingModedan DecimalFormat.

Cedric Dubourg
sumber
Tidak membahas Pertanyaan, yang meminta pemotongan daripada pembulatan.
Basil Bourque
8
@BasilBourque Rounding.DOWN adalah pemotongan. Bandingkan dengan jawaban lain yang salah merekomendasikan fungsi lantai (lantai hanya memotong angka positif), ini berfungsi dengan benar untuk nilai positif dan negatif.
Dev
1
@ Dev saya berdiri dikoreksi. Saya melihat sekarang itu DOWNmemang memiliki efek pemotongan untuk bilangan positif dan negatif. Seperti yang terlihat pada tabel contoh di doc .
Basil Bourque
24

Bit Old Forum, Tidak ada jawaban di atas yang berfungsi untuk nilai positif dan negatif (maksud saya untuk perhitungan dan hanya melakukan pemotongan tanpa Pembulatan). Dari Bagaimana untuk membulatkan angka ke tempat n desimal di Jawa Link

private static BigDecimal truncateDecimal(double x,int numberofDecimals)
{
    if ( x > 0) {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);
    } else {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);
    }
}

Metode ini bekerja dengan baik untuk saya.

System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));

Hasil:

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
Mani
sumber
ini adalah jawaban yang lebih dapat diskalakan untuk kasus uji lebih lanjut
diego matos - keke
kembali baru BigDecimal (x) .setScale (numberofDecimals, RoundingMode.DOWN) .doubleValue ();
Shimon Doodkin
sepertinya bulat ke bawah seperti yang Anda maksud: docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html
Shimon Doodkin
9

Perhatikan pertama bahwa a doubleadalah pecahan biner dan tidak benar - benar memiliki tempat desimal.

Jika Anda membutuhkan tempat desimal, gunakan a BigDecimal, yang memiliki setScale()metode untuk pemotongan, atau gunakan DecimalFormatuntuk mendapatkan String.

Michael Borgwardt
sumber
7

Jika, karena alasan apa pun, Anda tidak ingin menggunakan, BigDecimalAnda dapat melakukan cast doubleke an intuntuk memotongnya.

Jika Anda ingin memotong ke tempat Ones :

  • cukup dilemparkan ke int

Ke tempat Kesepuluh :

  • kalikan dengan sepuluh
  • dilemparkan ke int
  • melemparkan kembali ke double
  • dan bagi dengan sepuluh.

Tempat Hundreth

  • kalikan dan bagi dengan 100 dll.

Contoh:

static double truncateTo( double unroundedNumber, int decimalPlaces ){
    int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) );
    double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) );
    return truncatedNumber;
}

Dalam contoh ini, decimalPlacesakan menjadi jumlah tempat MASA LALU tempat satuan yang ingin Anda tuju, jadi 1 akan membulatkan ke tempat persepuluhan , 2 ke tempat perseratus , dan seterusnya (0 putaran ke tempat satuan , dan negatif satu ke puluhan , dll.)

Tarvis
sumber
3
Ini adalah solusi umum yang buruk . Baik perkalian dan pemeran pada akhirnya akan membuang data dan menghasilkan angka acak yang efektif jika unroundedNumbercukup besar. Ini mungkin berhasil untuk contoh dalam pertanyaan, tetapi solusi umum harus bekerja untuk apa saja double.
blm
6

Membentuk sebagai string dan mengubah kembali menjadi dua kali lipat saya pikir akan memberikan hasil yang Anda inginkan.

Nilai ganda tidak akan menjadi round (), floor () atau ceil ().

Perbaikan cepat untuk itu bisa jadi:

 String sValue = (String) String.format("%.2f", oldValue);
 Double newValue = Double.parseDouble(sValue);

Anda dapat menggunakan sValue untuk tujuan tampilan atau nilai baru untuk penghitungan.

Jao Assy
sumber
1
Itu membulatkan saya ke nilai terdekat. Misalnya: 0,018 diubah menjadi 0,02 ketika saya melakukan ini.
karan patel
3

Mungkinkah Math.floor(value * 100) / 100? Berhati-hatilah bahwa nilai seperti 3.54mungkin tidak persis diwakili dengan a double.

Vlad
sumber
3

Anda bisa menggunakan objek NumberFormat Class untuk menyelesaikan tugas.

// Creating number format object to set 2 places after decimal point
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);            
nf.setGroupingUsed(false);

System.out.println(nf.format(precision));// Assuming precision is a double type variable
Rushdi Shams
sumber
3

3.545555555 untuk mendapatkan 3.54. Coba Ikuti untuk ini:

    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);

Ini akan memberikan = 3,54!

Ankush G
sumber
Tetapi saya akan mendapatkan 3,5 jika saya menetapkan nilai itu 3,50123
Cyrus
1

Berikut metode yang saya gunakan:

double a=3.545555555; // just assigning your decimal to a variable
a=a*100;              // this sets a to 354.555555
a=Math.floor(a);      // this sets a to 354
a=a/100;              // this sets a to 3.54 and thus removing all your 5's

Ini juga bisa dilakukan:

a=Math.floor(a*100) / 100;
Mitchell Hynes
sumber
0

Mungkin mengikuti:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  
Ritesh Mengji
sumber
Lihat jawaban lainnya. Anda tidak dapat melakukannya dengan andal jika jawabannya disajikan dalam floating point.
Marquis dari Lorne
0

Pemeriksaan cepat adalah dengan menggunakan metode Math.floor. Saya membuat metode untuk memeriksa ganda untuk dua atau kurang tempat desimal di bawah ini:

public boolean checkTwoDecimalPlaces(double valueToCheck) {

    // Get two decimal value of input valueToCheck 
    double twoDecimalValue = Math.floor(valueToCheck * 100) / 100;

    // Return true if the twoDecimalValue is the same as valueToCheck else return false
    return twoDecimalValue == valueToCheck;
}
chris31389
sumber
-1

Saya memiliki versi Mani yang sedikit dimodifikasi .

private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) {
    return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN);
}

public static void main(String[] args) {
    System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(3.545555555, 2));

    System.out.println(truncateDecimal(9.0, 2));
    System.out.println(truncateDecimal(-9.62, 2));
    System.out.println(truncateDecimal(-9.621, 2));
    System.out.println(truncateDecimal(-9.629, 2));
    System.out.println(truncateDecimal(-9.625, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));
    System.out.println(truncateDecimal(-3.545555555, 2));

}

Keluaran:

0.00
9.62
9.62
9.62
9.62
9.99
9.00
3.54
-9.62
-9.62
-9.62
-9.62
-9.99
-9.00
-3.54
HolyLance
sumber
-2

Ini berhasil untuk saya:

double input = 104.8695412  //For example

long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;

//result == 104.87

Saya pribadi menyukai versi ini karena versi ini benar-benar melakukan pembulatan secara numerik, bukan dengan mengubahnya menjadi String (atau serupa) dan kemudian memformatnya.

Pelangi975
sumber
1
Pertanyaan aslinya adalah tentang pemotongan, bukan pembulatan. Selain itu, mengubah dobel menjadi panjang tidak akan berhasil sama sekali jika dobelnya cukup besar.
blm
-2
//if double_v is 3.545555555
String string_v= String.valueOf(double_v);
int pointer_pos = average.indexOf('.');//we find the position of '.'
string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form
double_v = Double.valueOf(string_v);//well this is the final result

nah ini mungkin sedikit canggung, tapi saya pikir ini bisa menyelesaikan masalah Anda :)

pengguna5251903
sumber
Kode ini menyelesaikan pekerjaan, tetapi tidak elegan dan memiliki kinerja yang buruk. Mungkin baik-baik saja dalam proyek sekolah, tetapi jelas bukan solusi yang digunakan seseorang dalam produksi untuk sistem apa pun, kecuali jika Anda ingin mengalami sakit kepala nanti.
cbaldan