Misalnya saya memiliki variabel 3.545555555, yang ingin saya potong menjadi hanya 3.54.
Misalnya saya memiliki variabel 3.545555555, yang ingin saya potong menjadi hanya 3.54.
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;
floor
untuk memotong hanya berfungsi untuk nilai positif.
RoundingMode.DOWN
seperti RoudingMode.FLOOR
biasa berputar menuju tak terhingga negatif.
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Periksa tersedia RoundingMode
dan DecimalFormat
.
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
Perhatikan pertama bahwa a double
adalah 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 DecimalFormat
untuk mendapatkan String
.
Jika, karena alasan apa pun, Anda tidak ingin menggunakan, BigDecimal
Anda dapat melakukan cast double
ke an int
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.)
unroundedNumber
cukup besar. Ini mungkin berhasil untuk contoh dalam pertanyaan, tetapi solusi umum harus bekerja untuk apa saja double
.
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.
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
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!
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;
Mungkin mengikuti:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
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;
}
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
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.
//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 :)