Formater le flottant à n décimales


220

J'ai besoin de formater un flotteur à "n" décimales.

essayait de BigDecimal, mais la valeur de retour n'est pas correcte ...

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
}

J'ai besoin de renvoyer une valeur flottante avec le nombre de décimales que je spécifie.

J'ai besoin d'un Floatretour de valeur nonDouble

.

Réponses:


561

Vous pouvez également transmettre la valeur flottante et utiliser:

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

Documentation


70
Veuillez faire attention car String.format dépend de votre configuration locale actuelle, vous ne pouvez pas obtenir un point comme séparateur. Préférez utiliserString.format(java.util.Locale.US,"%.2f", floatValue);
Gomino

6
cette réponse donne une valeur String, pas une valeur Float, je ne pense pas qu'une bonne réponse.
ZhaoGang

3
Pourquoi voudriez-vous forcer un point comme séparateur?
Mark Buikema

1
@MarkBuikema Je pense qu'il y a des cas où cela serait absolument nécessaire, comme lors de la compilation de formats de documents guidés par des normes, par exemple. Documents PDF.
Tjaart

39

Jetez un oeil à DecimalFormat . Vous pouvez facilement l'utiliser pour prendre un nombre et lui donner un nombre défini de décimales.

Modifier : Exemple


1
+1. Voici la documentation spécifique à Android , qui devrait être essentiellement la même.
Zach L

mais j'ai besoin que le résultat soit un nombre flottant, pas une chaîne.
seba123neo

Voulez-vous dire que vous voulez arrondir le flotteur? Normalement, la seule précision temporelle d'un flotteur est pour l'affichage.
Nick Campion

désolé, vous avez raison, j'étais confus, formatez simplement le nombre lorsqu'il est affiché à l'écran, pas avant, c'était ma question, merci beaucoup, problème résolu.
seba123neo

À noter, l'utilisation du DecimalFormatconstructeur est déconseillée, voir ma réponse pour une utilisation correcte de NumberFormat.
FBB

17

Essayez ceci, cela m'a beaucoup aidé

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

Le résultat sera ronde finalePrix -> 5652.26


2
Ceci est plus utile pour ceux qui cherchent à arrondir et à faire d'autres calculs avec, sinon la réponse d'Arve est probablement la meilleure.
Gerard

Cela fonctionne également avec GWT. String.format () - non.
AlexV

15

Il est à noter que l'utilisation du DecimalFormatconstructeur est déconseillée. Le javadoc de cette classe indique:

En général, n'appelez pas directement les constructeurs DecimalFormat, car les méthodes de fabrique NumberFormat peuvent renvoyer des sous-classes autres que DecimalFormat.

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

Donc, ce que vous devez faire est (par exemple):

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

Cela ne fonctionne pas lorsque (par exemple) floatValue = 8.499. Cela donne 8,5.
Shiva krishna Chippa

3
@ShivakrishnaChippa: oui, car ici nous précisons que nous voulons 2 chiffres après la virgule, et faire un arrondi vers le haut. Dans ce cas, 8,499 est arrondi à 8,5. Si vous souhaitez afficher 8,499, définissez simplement 3 comme nombre maximal de fractions.
FBB

6

Voici un exemple rapide utilisant la DecimalFormatclasse mentionnée par Nick.

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

La sortie de l'instruction print sera 12,35. Notez qu'il l'arrondira pour vous.


À noter, l'utilisation du DecimalFormatconstructeur est déconseillée, voir ma réponse pour une utilisation correcte de NumberFormat.
FBB

5

Un peu surpris que personne n'ait indiqué la manière directe de le faire, ce qui est assez facile.

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

Je suis sûr que cela ne permet pas d'arrondir à moitié même.

Pour ce que ça vaut, l'arrondi demi-pair va être chaotique et imprévisible à chaque fois que vous mélangez des valeurs à virgule flottante basées sur des binaires avec l'arithmétique de base 10. Je suis sûr que cela ne peut pas être fait. Le problème de base est qu'une valeur comme 1.105 ne peut pas être représentée exactement en virgule flottante. La valeur à virgule flottante sera quelque chose comme 1.105000000000001 ou 1.104999999999999. Ainsi, toute tentative d'effectuer un arrondi demi-pair entraîne des erreurs de codage de représentation.

Les implémentations en virgule flottante IEEE feront un demi-arrondi, mais elles feront un demi-arrondi binaire, pas un demi-arrondi décimal. Donc tu vas probablement bien


J'ai également utilisé cette méthode pendant un certain temps, mais je pense que powc'est une opération trop coûteuse à utiliser pour l'arrondi?
Xerus

N'optimisez jamais avant d'avoir réellement un problème de performances. Plus important d'avoir raison que rapide. Et je ne peux honnêtement pas imaginer une application où les performances d'arrondi contrôlé seraient un problème, à moins que vous ne soyez Visa ou Mastercard (qui ne ferait que lancer plus de machines). Et pow () est probablement plus rapide que 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

C'est un moyen beaucoup moins professionnel et beaucoup plus cher, mais il devrait être plus facile à comprendre et plus utile pour les débutants.

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

Je pense que ce que tu veux

return value.toString();

et utilisez la valeur de retour pour afficher.

value.floatValue();

renverra toujours 625,3 car il est principalement utilisé pour calculer quelque chose.


mais j'ai besoin que le résultat soit un nombre flottant, pas une chaîne.
seba123neo

2
si vous avez besoin d'un flotteur pour le montrer à l'utilisateur, il peut y avoir un problème avec la conception de l'application. Habituellement, le flotteur est utilisé pour calculer et une chaîne est utilisée pour le montrer à l'utilisateur.
n3utrino

désolé, vous avez raison, j'étais confus, formatez simplement le nombre lorsqu'il est affiché à l'écran, pas avant, c'était ma question, merci beaucoup, problème résolu.
seba123neo

1

Je cherchais une réponse à cette question et plus tard j'ai développé une méthode! :) Un avertissement juste, c'est arrondir la valeur.

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.