web-dev-qa-db-fra.com

Mettre en forme flottante à n décimales

Je dois formater un float à "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
}

Je dois renvoyer une valeur float avec le nombre de décimales que je spécifie.

J'ai besoin de Float value return not Double

.

212
seba123neo

Vous pouvez également transmettre la valeur float et utiliser:

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

Documentation

548
Arve

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

Éditer : Exemple

39
Nick Campion

Essayez ceci cela m'a beaucoup aidé

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

Le résultat sera roundfinalPrice -> 5652.26

16
Anupam

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

En général, n'appelez pas directement les constructeurs DecimalFormat, car les méthodes de la 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));
14
FBB

Voici un exemple rapide utilisant la classe DecimalFormat 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 que cela l'arrondira pour vous.

6
Tony L.

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

Bien sûr, cela ne fait pas l'arrondi à moitié même.

Pour ce que ça vaut, arrondir à moitié-moitié va être chaotique et imprévisible chaque fois que vous mélangez des valeurs à virgule flottante basées sur des données binaires avec une arithmétique en base 10. Je suis presque sûr que ça ne peut pas être fait. Le problème de base est qu’une valeur telle que 1.105 ne peut pas être représentée exactement en virgule flottante. La valeur en virgule flottante va être quelque chose comme 1.105000000000001 ou 1.104999999999999. Donc, toute tentative d'arrondir à moitié égal arrondit des erreurs d'encodage représentatives.

Les implémentations en virgule flottante IEEE font le demi-arrondi, mais elles le font binaire, et non décimal. Donc tu es probablement ok

4
Robin Davies

C'est un moyen beaucoup moins professionnel et beaucoup plus coûteux, 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;
}
2
Ethan Johnson
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
M. Usman Khan

Je pense ce que tu veux ist

return value.toString();

et utilisez la valeur de retour pour afficher.

value.floatValue();

retournera toujours 625.3 car il est principalement utilisé pour calculer quelque chose.

1
n3utrino

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));
}
1
Blogger