Formatta Float con n decimali


220

Ho bisogno di formattare un float in "n" posizioni decimali.

stava provando a BigDecimal, ma il valore restituito non è corretto ...

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
}

Devo restituire un valore float con il numero di cifre decimali da me specificato.

Non ho bisogno di Floatrestituire valoreDouble

.

Risposte:


561

Puoi anche passare il valore float e usare:

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

Documentazione


70
Fai attenzione perché String.format dipende dalla tua configurazione locale corrente, potresti non ottenere un punto come separatore. Preferisco usareString.format(java.util.Locale.US,"%.2f", floatValue);
Gomino

6
questa risposta dà un valore String, non un valore Float, non penso una buona risposta.
ZhaoGang

3
Perché dovresti forzare un punto come separatore?
Mark Buikema,

1
@MarkBuikema Penso che ci siano casi in cui sarebbe assolutamente necessario, come quando si compilano formati di documenti guidati da standard, ad es. Documenti PDF.
Tjaart

39

Dai un'occhiata a DecimalFormat . Puoi facilmente usarlo per prendere un numero e assegnargli un numero fisso di posizioni decimali.

Modifica : Esempio


1
+1. Ecco la documentazione specifica per Android , che dovrebbe essere essenzialmente la stessa.
Zach L

ma ho bisogno che il risultato sia un numero float, non una stringa.
seba123neo,

Stai dicendo che vuoi arrotondare il galleggiante? Normalmente l'unica precisione temporale di un galleggiante è importante per la visualizzazione.
Nick Campion,

scusa, hai ragione, ero confuso, basta formattare il numero quando mostrato sullo schermo, non prima, questa era la mia domanda, grazie mille, problema risolto.
seba123neo,

Da notare, l'uso del DecimalFormatcostruttore è scoraggiato, vedere la mia risposta per un uso corretto di NumberFormat.
FBB,

17

Prova questo, mi ha aiutato molto

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

Il risultato sarà roundfinalPrezzo -> 5652.26


2
Questo è più utile per coloro che desiderano arrotondare e fare alcuni calcoli con esso, altrimenti la risposta di Arve è probabilmente la migliore.
Gerard,

Funziona anche con GWT. String.format () - no.
AlexV,

15

Da notare, l'uso del DecimalFormatcostruttore è scoraggiato. Il javadoc per questa classe afferma:

In generale, non chiamare direttamente i costruttori DecimalFormat, poiché i metodi di fabbrica NumberFormat possono restituire sottoclassi diverse da DecimalFormat.

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

Quindi quello che devi fare è (ad esempio):

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));

Questo non funziona quando (ad esempio) floatValue = 8.499. Sta dando 8.5.
Shiva Krishna Chippa,

3
@ShivakrishnaChippa: sì, perché qui specifichiamo che vogliamo 2 cifre dopo la virgola e fare un arrotondamento per eccesso. In tal caso, 8.499 viene arrotondato a 8.5. Se si desidera visualizzare 8.499, impostare semplicemente 3 come cifre della frazione massima.
FBB,

6

Ecco un breve esempio usando la DecimalFormatclasse menzionata da Nick.

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

L'output dell'istruzione print sarà 12.35. Nota che lo arrotonderà per te.


Da notare, l'uso del DecimalFormatcostruttore è scoraggiato, vedere la mia risposta per un uso corretto di NumberFormat.
FBB,

5

Un po 'sorpreso che nessuno abbia indicato il modo diretto per farlo, il che è abbastanza facile.

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

Abbastanza sicuro, tuttavia, non è un arrotondamento nemmeno a metà.

Per quello che vale, l'arrotondamento a metà è caotico e imprevedibile ogni volta che mescoli valori a virgola mobile basati su binari con aritmetica di base 10. Sono abbastanza sicuro che non si possa fare. Il problema di base è che un valore come 1.105 non può essere rappresentato esattamente in virgola mobile. Il valore in virgola mobile sarà simile a 1.105000000000001 o 1.104999999999999. Quindi, qualsiasi tentativo di eseguire arrotondamenti semifiniti sta inciampando in errori di codifica rappresentativa.

Le implementazioni IEEE in virgola mobile eseguiranno il mezzo arrotondamento, ma il mezzo arrotondamento binario, non il mezzo arrotondamento decimale. Quindi probabilmente stai bene


Ho anche usato questo metodo per un po ', ma penso che powsia un'operazione troppo costosa da usare per arrotondare?
Xerus,

Non ottimizzare mai fino a quando non hai effettivamente un problema di prestazioni. Più importante essere giusto che veloce. E non posso onestamente immaginare un'applicazione in cui l'esecuzione di arrotondamenti controllati sarebbe un problema, a meno che tu non fossi Visa o Mastercard (che avrebbe semplicemente lanciato più macchine). E pow () è probabilmente più veloce di 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();
    }

2

Questo è un modo molto meno professionale e molto più costoso, ma dovrebbe essere più facile da capire e più utile per i principianti.

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

1

Penso che quello che vuoi sia

return value.toString();

e utilizzare il valore restituito per visualizzare.

value.floatValue();

restituirà sempre 625.3 perché viene utilizzato principalmente per calcolare qualcosa.


ma ho bisogno che il risultato sia un numero float, non una stringa.
seba123neo,

2
se hai bisogno di un float per mostrarlo all'utente, potrebbe esserci qualcosa di sbagliato nel design dell'applicazione. Di solito il float viene utilizzato per calcolare e una stringa viene utilizzata per mostrarlo all'utente.
n3utrino,

scusa, hai ragione, ero confuso, basta formattare il numero quando mostrato sullo schermo, non prima, questa era la mia domanda, grazie mille, problema risolto.
seba123neo,

1

Stavo cercando una risposta a questa domanda e in seguito ho sviluppato un metodo! :) Un avvertimento equo, sta arrotondando il valore.

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.