Örneğin, 3.545555555 değişkenine sahibim, bunu sadece 3.54'e düşürmek istiyorum.
Örneğin, 3.545555555 değişkenine sahibim, bunu sadece 3.54'e düşürmek istiyorum.
Yanıtlar:
Bunu görüntüleme amacıyla kullanmak istiyorsanız, şunu kullanın java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
Hesaplamalar için ihtiyacınız varsa, şunu kullanın java.lang.Math
:
Math.floor(value * 100) / 100;
floor
için kullanmak yalnızca pozitif değerler için işe yarar.
RoundingMode.DOWN
gibi RoudingMode.FLOOR
negatif sonsuzluğa doğru doğru bir şekilde yapılır .
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Mevcut kontrol edin RoundingMode
ve DecimalFormat
.
DOWN
, bu gerçekten hem pozitif hem de negatif sayılar için kesme etkisine sahiptir. Gibi örnekler Tabloda görüldüğü doc .
Biraz Eski Forum, Yukarıdaki cevaplardan hiçbiri hem pozitif hem de negatif değerler için işe yaramadı (yani hesaplama için ve sadece Yuvarlama olmadan kesme yapmak için). Gönderen How Java n ondalık basamağa sayıya yuvarlamak için bağlantı
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);
}
}
Bu yöntem benim için iyi çalıştı.
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));
Sonuçlar :
0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
Not öncelikle bir o double
ikili kesir ve gerçekten değil sahip ondalık basamak.
Eğer yerleri onluya Eğer gerekirse, bir kullanmak BigDecimal
bir olan, setScale()
budamaya yöntem veya kullanımını DecimalFormat
bir olsun String
.
Her ne sebeple olursa olsun, a kullanmak istemiyorsanız, onu kesmek için bir ' e BigDecimal
çevirebilirsiniz .double
int
Ones yerine kısaltmak istiyorsanız :
int
To onluk bir yerde:
int
double
Hundreths yeri
Misal:
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;
}
Bu örnekte, decimalPlaces
olanları gitmek istediğiniz yere gönderilen yerlerin sayısı olacağını, bu nedenle 1 olur yuvarlak için onda yerde, 2 yüzde biri ve bu yüzden (0 turlarında olanlar yerinde ve onlarca negatif biri , vb.)
unroundedNumber
yeterince büyükse etkili bir şekilde rastgele sayılarla sonuçlanacaktır . Sorudaki örnek için işe yarayabilir, ancak genel bir çözüm herhangi biri için çalışmalıdır double
.
Bir dizge olarak biçimlendirmek ve tekrar ikiye dönüştürmek bence size istediğiniz sonucu verecektir.
Çift değer round (), floor () veya ceil () olmayacaktır.
Bunun için hızlı bir düzeltme şunlar olabilir:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
SValue değerini görüntüleme amacıyla veya newValue değerini hesaplama için kullanabilirsiniz.
Görevi gerçekleştirmek için NumberFormat Class nesnesini kullanabilirsiniz.
// 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
İşte kullandığım yöntem:
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
Bu aynı zamanda yapılabilir:
a=Math.floor(a*100) / 100;
Belki aşağıdaki:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
Hızlı bir kontrol, Math.floor yöntemini kullanmaktır. Aşağıda iki veya daha az ondalık basamak için bir çift kontrol etmek için bir yöntem oluşturdum:
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;
}
Mani'nin biraz değiştirilmiş bir versiyonuna sahibim .
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));
}
Çıktı:
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
Bu benim için çalıştı:
double input = 104.8695412 //For example
long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;
//result == 104.87
Ben şahsen bu sürümü seviyorum çünkü yuvarlamayı bir String'e (veya benzerine) dönüştürüp sonra biçimlendirmek yerine sayısal olarak gerçekleştiriyor.
//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
Pekala, bu biraz tuhaf olabilir, ancak sorununuzu çözebileceğini düşünüyorum :)