Java'da bir ikiliyi yalnızca iki ondalık basamağa nasıl kısaltabilirim?


98

Örneğin, 3.545555555 değişkenine sahibim, bunu sadece 3.54'e düşürmek istiyorum.


21
Bu bir kopya DEĞİLDİR. Kesmek ve yuvarlamak tamamen farklı iki şeydir.
markthegrea

Kabul edildi, bunun neden kopya olarak işaretlendiğini bilmiyorum.
Bassinator

Yanıtlar:


147

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;

50
Bu olacak değil bir 3.54 için 3.545555555 kesilebilir, ancak 3.55 yuvarlanır görüntüler. DecimalFormat.setRoundingMode (), RoundingMode.FLOOR olarak ayarlanmalıdır;
Christian Garcia

9
bu benim için çalışmıyor Math.floor (9.62 * 100) / 100, 9.61 verir
Mani

4
Kesmek flooriçin kullanmak yalnızca pozitif değerler için işe yarar.
Dev

4
@ ChristianGarcía Kesme, her zaman olduğu RoundingMode.DOWNgibi RoudingMode.FLOORnegatif sonsuzluğa doğru doğru bir şekilde yapılır .
Dev

46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

Mevcut kontrol edin RoundingModeve DecimalFormat.


Yuvarlamak yerine kesilmesini isteyen Soruyu ele almıyor.
Basil Bourque

8
@BasilBourque RoundingMode.DOWN kısaltmadır. Kat işlevlerini yanlış olarak öneren diğer yanıtlarla karşılaştırın (kat yalnızca pozitif sayıları keser), bu hem pozitif hem de negatif değerler için doğru şekilde çalışır.
Dev

1
@Dev düzeltildi. Şimdi görüyorum ki DOWN, bu gerçekten hem pozitif hem de negatif sayılar için kesme etkisine sahiptir. Gibi örnekler Tabloda görüldüğü doc .
Basil Bourque

24

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

bu cevap daha fazla test
senaryosu için moral

yeni BigDecimal (x) .setScale (numberofDecimals, RoundingMode.DOWN) .doubleValue ();
Şimon Doodkin

yuvarlak aşağı baktığınız
Shimon Doodkin

9

Not öncelikle bir o doubleikili kesir ve gerçekten değil sahip ondalık basamak.

Eğer yerleri onluya Eğer gerekirse, bir kullanmak BigDecimalbir olan, setScale()budamaya yöntem veya kullanımını DecimalFormatbir olsun String.


7

Her ne sebeple olursa olsun, a kullanmak istemiyorsanız, onu kesmek için bir ' e BigDecimalçevirebilirsiniz .doubleint

Ones yerine kısaltmak istiyorsanız :

  • basitçe yayınla int

To onluk bir yerde:

  • on ile çarp
  • döküm int
  • geri dönmek double
  • ve ona bölün.

Hundreths yeri

  • çarpın ve 100 ile bölün vb.

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, decimalPlacesolanları 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.)


3
Bu korkunç bir genel çözüm. Hem çarpma hem de atma, verileri çöpe atacak ve unroundedNumberyeterince 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.
blm

6

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.


1
Benim için en yakın değere yuvarlanıyor. Örneğin: Bunu yaptığımda 0,018, 0,02'ye dönüştürülür.
karan patel

3

Belki Math.floor(value * 100) / 100? Gibi değerlerin 3.54tam olarak a ile temsil edilmeyebileceğine dikkat edin double.


3

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

3

3.545555555, 3.54. Bunun için Aşağıdakileri deneyin:

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

    df.setRoundingMode(RoundingMode.FLOOR);

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

Bu = 3,54 verir!


Ama bu değeri 3.50123 olarak ayarlarsam 3.5 alacağım
Cyrus

1

İş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;

0

Belki aşağıdaki:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  

Diğer cevaplara bakın. Cevap kayan noktada temsil edilecekse, bunu güvenilir bir şekilde yapamazsınız.
Marquis of Lorne

0

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;
}

-1

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

-2

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.


1
Asıl soru yuvarlama değil, kesme ile ilgilidir. Ayrıca, dublör yeterince büyükse ikiye katlamayı uzuna dönüştürmek hiç işe yaramayacaktır.
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

Pekala, bu biraz tuhaf olabilir, ancak sorununuzu çözebileceğini düşünüyorum :)


Bu kod işin yapılmasını sağlar, ancak zarif değildir ve performansı düşüktür. Okul projelerinde sorun olmayabilir, ancak daha sonra başınızı ağrıtmak istemiyorsanız, herhangi bir sistem için üretimde kesinlikle birisinin kullanacağı bir çözüm değildir.
cbaldan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.