Convertir Double en chaîne, supprimer les décimales

Convertir Double en chaîne, supprimer les décimales

1. introduction

Dans ce didacticiel, nous allons examiner lesdifferent ways to convert a double value to a String, removing its decimal places.

Nous allons voir comment le faire lorsque nous voulons simplement tronquer la partie décimale et quand nous voulons l'arrondir.

2. Troncature à l'aide de la diffusion

Si la valeur de notredouble se situe dans la plage deint, nous pouvonscast it to an intLe cast tronque la partie décimale, ce qui signifie qu'il la coupe sans arrondir.

Cette approche est environ 10 fois plus rapide que les autres approches que nous allons examiner.

Une fois qu'il s'agit d'unint,then we can then pass it to the valueOf methodon the String class:

String truncated = String.valueOf((int) doubleValue);

Nous pouvons utiliser cette approche en toute confiance lorsque nous sommes assurés quethe double value is within the range of an int. Maisif our value exceeds that, casting won’t work like we’d want.

3. Arrondi avecString.format()

Désormais, les approches restantes ne sont pas aussi limitées que le casting, mais elles ont leurs propres nuances.

Par exemple, une autre approche consiste à utiliser la méthodeformat de la classeString. Le premier paramètre de la méthode spécifie que nous sommes en train de formater une valeur à virgule flottante avec zéro chiffre après le point décimal:

String rounded = String.format("%.0f", doubleValue);

The format method uses HALF_UP rounding qui arrondira vers le haut si la valeur après la partie fractionnaire est égale ou supérieure à 0,5. Sinon, il retourne le nombre avant la virgule.

Et bien que simple,String.formatis the slowest way to do this.

4. Utilisation deNumberFormat.format()

La classeNumberFormat fournit également une méthodeformat similaire à la classeString, maisNumberFormat is faster and with it, we can specify the rounding mode to achieve either truncation or rounding.

La méthodesetMaximumFractionDigits() indique au formateur le nombre de chiffres fractionnaires après la virgule décimale à inclure dans la sortie:

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(0);
String rounded = nf.format(doubleValue);

Curiously, NumberFormat doesn’t use HALF_UP by default. Au lieu de cela, il utilise l'arrondi deHALF_EVEN par défaut, ce qui signifie qu'il arrondira comme d'habitude sauf à 0,5,in which case it will pick the nearest even number.

While HALF_EVEN is helpful with statistical analysis, utilisonsHALF_UP pour être cohérent:

nf.setRoundingMode(RoundingMode.HALF_UP);
String rounded = nf.format(doubleValue);

Et,we can change this and achieve truncation by setting the formatter to use the FLOOR rounding mode instead:

nf.setRoundingMode(RoundingMode.FLOOR);
String truncated = nf.format(doubleValue)

Et maintenant, il va tronquer au lieu de rond.

5. Utilisation deDecimalFormat.format()

Semblable àNumberFormat, la classeDecimalFormat peut être utilisée pour formater les valeursdouble. Cependant, au lieu de définir le format de sortie avec des appels de méthode,we can tell the formatter what output we want by providing the constructor with a specific pattern:

DecimalFormat df = new DecimalFormat("#,###");
df.setRoundingMode(RoundingMode.HALF_UP);
String rounded = df.format(doubleValue);

Le modèle «, ##» signifie que nous voulons que le formateur ne renvoie que la partie entière de l'entrée. Il indique également que nous voulons regrouper les chiffres par trois, séparés par une virgule.

Les mêmes valeurs d'arrondi par défaut s'appliquent ici, donc si nous voulons afficher une valeur tronquée, nous pouvons définir le mode d'arrondi surFLOOR:

df.setRoundingMode(RoundingMode.FLOOR);
String truncated = df.format(doubleValue)

6. Utilisation deBigDecimal.toString()

La dernière approche que nous examinerons estBigDecimal, que nous inclurons parce queit out-performs NumberFormat and DecimalFormat for larger doubles.

Nous pouvons utiliser la méthodesetScale deBigDecimal pour dire si nous voulons arrondir ou tronquer:

double largeDouble = 345_345_345_345.56;
BigDecimal big = new BigDecimal(largeDouble);
big = big.setScale(0, RoundingMode.HALF_UP);

N'oubliez pas queBigDecimals sont immuables, donc, comme les chaînes, nous devons réinitialiser la valeur.

Et, ensuite, nous appelons simplementBigDecimal´stoString:

String rounded = big.toString();

7. Conclusion

Dans ce didacticiel,we looked at the different ways in which we can convert a double to a String while removing decimal places. Nous avons fourni des approches qui produiraient des valeurs arrondies ou tronquées.

Comme d'habitude, les échantillons et benchmarks sont disponiblesover on GitHub.