Wie kann ich in Java ein Doppel auf nur zwei Dezimalstellen kürzen?

93

Zum Beispiel habe ich die Variable 3.545555555, die ich auf nur 3.54 kürzen möchte.

Johnny
quelle
18
Dies ist KEIN Duplikat. Abschneiden und Runden sind zwei völlig verschiedene Dinge.
Markthegrea
Einverstanden, weiß nicht, warum dies als Duplikat gekennzeichnet ist.
Bassinator

Antworten:

144

Wenn Sie dies zu Anzeigezwecken wünschen, verwenden Sie java.text.DecimalFormat:

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

Wenn Sie es für Berechnungen benötigen, verwenden Sie java.lang.Math:

 Math.floor(value * 100) / 100;
Bozho
quelle
50
Dies zeigt keine abgeschnittenen 3.545555555 bis 3.54 an, sondern gerundet auf 3.55. DecimalFormat.setRoundingMode () muss auf RoundingMode.FLOOR gesetzt werden.
Christian García
9
das funktioniert bei mir nicht Math.floor (9.62 * 100) / 100 gibt 9.61
Mani
4
Das floorAbschneiden funktioniert nur bei positiven Werten.
Dev
3
@ ChristianGarcía Das Abschneiden erfolgt RoundingMode.DOWNwie RoudingMode.FLOORimmer mit Runden in Richtung negativer Unendlichkeit.
Dev
46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

Überprüfen Sie verfügbar RoundingModeund DecimalFormat.

Cedric Dubourg
quelle
Behandelt nicht die Frage, bei der eher nach Kürzung als nach Rundung gefragt wurde.
Basil Bourque
8
@BasilBourque RoundingMode.DOWN ist Kürzung. Vergleichen Sie mit anderen Antworten, die fälschlicherweise Bodenfunktionen empfehlen (Boden schneidet nur positive Zahlen ab), dies funktioniert sowohl für positive als auch für negative Werte korrekt.
Dev
1
@ Dev ich stehe korrigiert. Ich sehe jetzt, dass DOWNdies tatsächlich den Effekt einer Kürzung sowohl für positive als auch für negative Zahlen hat. Wie in der Beispieltabelle im Dokument zu sehen .
Basil Bourque
23

Bit Old Forum, Keine der obigen Antworten hat sowohl für positive als auch für negative Werte funktioniert (ich meine für die Berechnung und nur zum Abschneiden ohne Rundung). Vom Link Runden einer Zahl auf n Dezimalstellen im Java- 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);
    }
}

Diese Methode hat bei mir gut funktioniert.

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

Ergebnisse :

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
Mani
quelle
Dies ist die Antwort mehr skalierbar für mehr Testfall
Diego Matos - Keke
return new BigDecimal (x) .setScale (Anzahl der Dezimalzahlen, RoundingMode.DOWN) .doubleValue ();
Shimon Doodkin
Abgerundet
9

Hinweis zunächst , dass eine doubleeine Binärbruch ist und nicht wirklich haben Dezimalstellen.

Wenn Sie Dezimalstellen benötigen, verwenden Sie a BigDecimal, das eine setScale()Methode zum Abschneiden enthält, oder verwenden Sie DecimalFormat, um a zu erhalten String.

Michael Borgwardt
quelle
7

Wenn Sie aus irgendeinem Grund keine verwenden möchten, BigDecimalkönnen Sie Ihre doublein eine intumwandeln, um sie abzuschneiden.

Wenn Sie auf den Ort der Einen kürzen möchten :

  • einfach besetzen int

Zum zehnten Platz:

  • mit zehn multiplizieren
  • gegossen zu int
  • zurückwerfen auf double
  • und durch zehn teilen.

Hundreths Platz

  • multiplizieren und dividieren durch 100 usw.

Beispiel:

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

In diesem Beispiel decimalPlaceswäre die Anzahl der Stellen VERGANGEN, an die Sie gehen möchten, also würde 1 auf die Zehntelstelle , 2 auf die Hundertstel usw. runden (0 Runden auf die Einerstelle und eine negative auf die Zehnerstelle , etc.)

Tarvis
quelle
3
Dies ist eine schreckliche allgemeine Lösung. Sowohl die Multiplikation als auch die Besetzung werden am Ende Daten wegwerfen und zu Zufallszahlen führen, wenn diese unroundedNumbergroß genug sind. Es mag für das Beispiel in der Frage funktionieren, aber eine allgemeine Lösung sollte für jedes funktionieren double.
Blm
4

Wenn Sie als Zeichenfolge formatieren und wieder in Double konvertieren, erhalten Sie das gewünschte Ergebnis.

Der doppelte Wert ist nicht rund (), Boden () oder Decke ().

Eine schnelle Lösung könnte sein:

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

Sie können den sValue für Anzeigezwecke oder den newValue für die Berechnung verwenden.

Jao Assy
quelle
1
Es rundet für mich auf den nächsten Wert. Zum Beispiel: 0.018 wird dabei in 0.02 konvertiert.
Karan Patel
3

Vielleicht Math.floor(value * 100) / 100? Beachten Sie, dass die Werte wie 3.54möglicherweise nicht genau mit a dargestellt werden double.

Vlad
quelle
3

Sie können das NumberFormat-Klassenobjekt verwenden, um die Aufgabe auszuführen.

// 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
quelle
3

3.545555555, um 3.54 zu erhalten. Versuchen Sie Folgendes:

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

    df.setRoundingMode(RoundingMode.FLOOR);

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

Dies ergibt = 3,54!

Ankush G.
quelle
1

Hier ist die Methode, die ich benutze:

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

Dies kann auch durchgeführt werden:

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

Vielleicht folgendes:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  
Ritesh Mengji
quelle
Siehe die anderen Antworten. Sie können es nicht zuverlässig tun, wenn die Antwort in Gleitkomma dargestellt werden soll.
Marquis von Lorne
0

Eine schnelle Überprüfung ist die Verwendung der Math.floor-Methode. Ich habe eine Methode erstellt, um ein Double auf zwei oder weniger Dezimalstellen zu überprüfen:

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
quelle
-1

Ich habe eine leicht modifizierte Version von Mani .

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

}

Ausgabe:

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
quelle
-2

Das hat bei mir funktioniert:

double input = 104.8695412  //For example

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

//result == 104.87

Ich persönlich mag diese Version, weil sie die Rundung tatsächlich numerisch durchführt, anstatt sie in einen String (oder einen ähnlichen) zu konvertieren und dann zu formatieren.

Regenbogen975
quelle
1
Die ursprüngliche Frage betrifft das Abschneiden, nicht das Runden. Außerdem funktioniert das Konvertieren eines Double in ein Long überhaupt nicht gut, wenn das Double groß genug ist.
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

Nun, das mag etwas umständlich sein, aber ich denke, es kann dein Problem lösen :)

user5251903
quelle
Dieser Code erledigt die Arbeit, ist aber nicht elegant und weist eine schlechte Leistung auf. In Schulprojekten mag es in Ordnung sein, aber definitiv keine Lösung, die jemand in der Produktion für ein System verwenden würde, es sei denn, Sie möchten später Kopfschmerzen haben.
Cbaldan