Convertir un double en chaîne, en supprimant les décimales

1. Introduction

Dans ce didacticiel, nous examinerons les différentes façons de convertir une valeur double en chaîne , en supprimant ses décimales.

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

2. Troncature à l'aide de la diffusion

Si notre valeur double est dans la plage int , nous pouvons la convertir en int . La distribution tronque la partie décimale, ce qui signifie qu'elle la coupe sans arrondir.

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

Une fois qu'il s'agit d'un int, nous pouvons ensuite le passer à la méthode valueOf de la classe String :

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

Nous pouvons utiliser cette approche en toute confiance lorsque nous avons la garantie que la valeur double est dans la plage d'un int . Mais si notre valeur dépasse cela, la diffusion ne fonctionnera pas comme nous le souhaiterions .

3. Arrondi à l'aide de String.format ()

Maintenant, 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éthode format de la classe String . Le premier paramètre de la méthode spécifie que nous mettons en forme une valeur à virgule flottante avec zéro chiffre après la virgule décimale:

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

La méthode de format utilise l' arrondi HALF_UP qui arrondira vers le haut si la valeur après la partie fractionnaire est égale ou supérieure à 0,5. Sinon, il renvoie le nombre avant la virgule décimale.

Et bien que simple, String.format est le moyen le plus lent de le faire .

4. Utilisation de NumberFormat.format ()

La classe NumberFormat fournit également une méthode de format similaire à la classe String , mais NumberFormat est plus rapide et avec elle, nous pouvons spécifier le mode d'arrondi pour obtenir une troncature ou un arrondi.

La méthode setMaximumFractionDigits () 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);

Curieusement, NumberFormat n'utilise pas HALF_UP par défaut. Au lieu de cela, il utilise l' arrondi HALF_EVEN par défaut, ce qui signifie qu'il arrondira comme d'habitude sauf à 0,5, auquel cas il choisira le nombre pair le plus proche .

Bien que HALF_EVEN soit utile pour l'analyse statistique, utilisons HALF_UP pour être cohérent:

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

Et, nous pouvons changer cela et obtenir une troncature en définissant le formateur pour utiliser le mode d'arrondi FLOOR à la place:

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

Et maintenant, il tronquera au lieu d'arrondir.

5. Utilisation de DecimalFormat.format ()

Semblable à NumberFormat , la classe DecimalFormat peut être utilisée pour formater des valeurs doubles . Cependant, au lieu de définir le format de sortie avec des appels de méthode, nous pouvons indiquer au formateur quelle sortie nous voulons en fournissant au constructeur un modèle spécifique:

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 signale également que nous voulons que les chiffres soient groupés 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 sur FLOOR :

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

6. Utilisation de BigDecimal.toString ()

La dernière approche que nous allons voir est BigDecimal , que nous allons inclure parce hors-performe NumberFormat et DecimalFormat pour les grands doubles s .

Nous pouvons utiliser la méthode setScale de BigDecimal 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 que les BigDecimal sont immuables, donc, comme les chaînes, nous devons réinitialiser la valeur.

Et puis, il suffit d' appeler BigDecimal de » toString :

String rounded = big.toString();

7. Conclusion

Dans ce didacticiel, nous avons examiné les différentes façons dont nous pouvons convertir un double en chaîne tout en supprimant les décimales. Nous avons fourni des approches qui produiraient des valeurs arrondies ou tronquées.

Comme d'habitude, les exemples et les benchmarks sont disponibles over sur GitHub.