Misalnya saya memiliki variabel 3.545555555, yang ingin saya potong menjadi hanya 3.54.
java
double
truncate
decimalformat
Johnny
sumber
sumber
Jawaban:
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;
sumber
floor
untuk memotong hanya berfungsi untuk nilai positif.RoundingMode.DOWN
sepertiRoudingMode.FLOOR
biasa berputar menuju tak terhingga negatif.DecimalFormat df = new DecimalFormat(fmt); df.setRoundingMode(RoundingMode.DOWN); s = df.format(d);
Periksa tersedia
RoundingMode
danDecimalFormat
.sumber
DOWN
memang memiliki efek pemotongan untuk bilangan positif dan negatif. Seperti yang terlihat pada tabel contoh di doc .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
sumber
Perhatikan pertama bahwa a
double
adalah pecahan biner dan tidak benar - benar memiliki tempat desimal.Jika Anda membutuhkan tempat desimal, gunakan a
BigDecimal
, yang memilikisetScale()
metode untuk pemotongan, atau gunakanDecimalFormat
untuk mendapatkanString
.sumber
Jika, karena alasan apa pun, Anda tidak ingin menggunakan,
BigDecimal
Anda dapat melakukan castdouble
ke anint
untuk memotongnya.Jika Anda ingin memotong ke tempat Ones :
int
Ke tempat Kesepuluh :
int
double
Tempat Hundreth
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,
decimalPlaces
akan 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.)sumber
unroundedNumber
cukup besar. Ini mungkin berhasil untuk contoh dalam pertanyaan, tetapi solusi umum harus bekerja untuk apa sajadouble
.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.
sumber
Mungkinkah
Math.floor(value * 100) / 100
? Berhati-hatilah bahwa nilai seperti3.54
mungkin tidak persis diwakili dengan adouble
.sumber
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
sumber
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!
sumber
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;
sumber
Mungkin mengikuti:
double roundTwoDecimals(double d) { DecimalFormat twoDForm = new DecimalFormat("#.##"); return Double.valueOf(twoDForm.format(d)); }
sumber
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; }
sumber
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
sumber
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.
sumber
//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 :)
sumber