Formatieren Sie Float auf n Dezimalstellen

220

Ich muss ein Float auf "n" Dezimalstellen formatieren.

habe versucht, BigDecimal, aber der Rückgabewert ist nicht korrekt ...

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}

Ich muss einen Gleitkommawert mit der von mir angegebenen Anzahl von Dezimalstellen zurückgeben.

Ich brauche Floatkeine WertrückgabeDouble

.

seba123neo
quelle

Antworten:

561

Sie können auch den Gleitkommawert übergeben und Folgendes verwenden:

String.format("%.2f", floatValue);

Dokumentation

Arve
quelle
70
Bitte seien Sie vorsichtig, da String.format von Ihrer aktuellen lokalen Konfiguration abhängt. Möglicherweise erhalten Sie keinen Punkt als Trennzeichen. Verwenden Sie String.format(java.util.Locale.US,"%.2f", floatValue);
lieber
6
Diese Antwort gibt einen String-Wert, keinen Float-Wert, ich denke keine gute Antwort.
ZhaoGang
3
Warum würden Sie einen Punkt als Trennzeichen erzwingen?
Mark Buikema
1
@MarkBuikema Ich denke, es gibt Fälle, in denen dies unbedingt erforderlich wäre, beispielsweise beim Kompilieren von Dokumentformaten, die von Standards gesteuert werden, z. PDF-Dokumente.
Tjaart
39

Schauen Sie sich DecimalFormat an . Sie können es leicht verwenden, um eine Zahl zu nehmen und ihr eine festgelegte Anzahl von Dezimalstellen zu geben.

Bearbeiten : Beispiel

Nick Campion
quelle
1
+1. Hier ist die Android-spezifische Dokumentation , die im Wesentlichen identisch sein sollte.
Zach L
aber ich brauche das Ergebnis ist eine Gleitkommazahl, keine Zeichenfolge.
seba123neo
Wollen Sie damit sagen, dass Sie den Wagen umrunden möchten? Normalerweise ist die einzige Zeitgenauigkeit eines Schwimmers für die Anzeige von Bedeutung.
Nick Campion
Entschuldigung, Sie haben Recht, ich war verwirrt, formatieren Sie einfach die Nummer, wenn sie auf dem Bildschirm angezeigt wird, nicht vorher, das war meine Frage, vielen Dank, Problem gelöst.
seba123neo
Zu beachten ist, dass von der Verwendung eines DecimalFormatKonstruktors abgeraten wird. Eine korrekte Verwendung von finden Sie in meiner Antwort NumberFormat.
FBB
17

Versuchen Sie dies, das hat mir sehr geholfen

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);

Ergebnis ist roundfinalPrice -> 5652.26

Anupam
quelle
2
Dies ist nützlicher für diejenigen, die runden und weitere Berechnungen damit durchführen möchten. Andernfalls ist Arves Antwort wahrscheinlich die beste.
Gerard
Dies funktioniert auch mit GWT. String.format () - nicht.
AlexV
15

Von der Verwendung eines DecimalFormatKonstruktors wird abgeraten. Das Javadoc für diese Klasse lautet:

Rufen Sie die DecimalFormat-Konstruktoren im Allgemeinen nicht direkt auf, da die NumberFormat-Factory-Methoden möglicherweise andere Unterklassen als DecimalFormat zurückgeben.

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

Was Sie also tun müssen, ist (zum Beispiel):

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));
FBB
quelle
Dies funktioniert nicht, wenn (zum Beispiel) floatValue = 8.499. Es gibt 8,5.
Shiva krishna Chippa
3
@ShivakrishnaChippa: Ja, denn hier geben wir an, dass wir 2 Ziffern nach dem Komma haben und eine Aufrundung durchführen möchten. In diesem Fall wird 8.499 auf 8.5 gerundet. Wenn 8.499 angezeigt werden soll, legen Sie einfach 3 als maximale Bruchziffern fest.
FBB
6

Hier ist ein kurzes Beispiel mit der DecimalFormatvon Nick erwähnten Klasse.

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

Die Ausgabe der print-Anweisung ist 12.35. Beachten Sie, dass es für Sie rundet.

Tony L.
quelle
Zu beachten ist, dass von der Verwendung eines DecimalFormatKonstruktors abgeraten wird. Eine korrekte Verwendung von finden Sie in meiner Antwort NumberFormat.
FBB
5

Ein bisschen überrascht, dass niemand auf den direkten Weg hingewiesen hat, was einfach genug ist.

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}

Ich bin mir ziemlich sicher, dass dies keine halbrunde Rundung macht.

Für das, was es wert ist, wird eine halbgleichmäßige Rundung jedes Mal chaotisch und unvorhersehbar sein, wenn Sie binärbasierte Gleitkommawerte mit Basis-10-Arithmetik mischen. Ich bin mir ziemlich sicher, dass das nicht geht. Das Grundproblem besteht darin, dass ein Wert wie 1.105 nicht genau im Gleitkomma dargestellt werden kann. Der Gleitkommawert wird ungefähr 1.105000000000001 oder 1.104999999999999 sein. Jeder Versuch, eine halbgleichmäßige Rundung durchzuführen, führt also zu Repräsentationscodierungsfehlern.

IEEE-Gleitkommaimplementierungen führen eine Halbrundung durch, jedoch eine binäre Halbrundung und keine dezimale Halbrundung. Also bist du wahrscheinlich in Ordnung

Robin Davies
quelle
Ich habe diese Methode auch eine Weile verwendet, aber ich würde denken, dass dies poweine zu teure Operation zum Runden ist?
Xerus
Optimieren Sie niemals, bis Sie tatsächlich ein Leistungsproblem haben. Es ist wichtiger, richtig zu sein als schnell. Und ich kann mir ehrlich gesagt keine Anwendung vorstellen, bei der die Leistung einer kontrollierten Rundung ein Problem darstellt, es sei denn, Sie waren Visa oder Mastercard (die einfach mehr Maschinen darauf werfen würden). Und pow () ist wahrscheinlich schneller als round ().
Robin Davies
2
public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }
M. Usman Khan
quelle
2

Dies ist eine viel weniger professionelle und viel teurere Methode, die jedoch für Anfänger verständlicher und hilfreicher sein sollte.

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}
Ethan Johnson
quelle
1

Ich denke was du willst ist

return value.toString();

und verwenden Sie den Rückgabewert zur Anzeige.

value.floatValue();

wird immer 625.3 zurückgeben, da es hauptsächlich zur Berechnung von etwas verwendet wird.

n3utrino
quelle
aber ich brauche das Ergebnis ist eine Gleitkommazahl, keine Zeichenfolge.
seba123neo
2
Wenn Sie einen Float benötigen, um ihn dem Benutzer anzuzeigen, stimmt möglicherweise etwas mit dem Design der Anwendung nicht. Normalerweise wird der Float zur Berechnung verwendet und eine Zeichenfolge wird verwendet, um ihn dem Benutzer anzuzeigen.
n3utrino
Entschuldigung, Sie haben Recht, ich war verwirrt, formatieren Sie einfach die Nummer, wenn sie auf dem Bildschirm angezeigt wird, nicht vorher, das war meine Frage, vielen Dank, Problem gelöst.
seba123neo
1

Ich suchte nach einer Antwort auf diese Frage und entwickelte später eine Methode! :) Eine faire Warnung, es rundet den Wert ab.

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
Blogger
quelle