Ce que je voudrais, c'est une méthode pour convertir un double en une chaîne qui arrondit en utilisant la méthode de la moitié supérieure - c'est-à-dire que si la décimale à arrondir est 5, elle arrondit toujours au nombre supérieur. Il s'agit de la méthode d'arrondi standard à laquelle la plupart des gens s'attendent dans la plupart des situations.
J'aimerais également que seuls les chiffres significatifs soient affichés, c'est-à-dire qu'il ne doit pas y avoir de zéros à la fin.
Je sais qu'une méthode pour y parvenir est d'utiliser la méthode String.format
:
String.format("%.5g%n", 0.912385);
retourne :
0.91239
ce qui est très bien, mais il affiche toujours les nombres avec 5 décimales même s'ils ne sont pas significatifs :
String.format("%.5g%n", 0.912300);
retourne :
0.91230
Une autre méthode consiste à utiliser le DecimalFormatter
:
DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);
retourne :
0.91238
Cependant, comme vous pouvez le constater, cette méthode utilise un arrondi demi-pair. C'est-à-dire qu'elle arrondit à la baisse si le chiffre précédent est pair. Voici ce que j’aimerais :
0.912385 -> 0.91239
0.912300 -> 0.9123
Quelle est la meilleure façon d'y parvenir en Java ?
Utilisez [setRoundingMode
][1], définissez le [RoundingMode
][2] explicitement pour gérer votre problème avec le tour demi-pair, puis utilisez le modèle de format pour votre sortie requise.
Exemple :
DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
Double d = n.doubleValue();
System.out.println(df.format(d));
}
donne le résultat :
12
123.1235
0.23
0.1
2341234.2125
EDIT : La réponse originale ne traite pas de la précision des valeurs doubles. C'est très bien si vous ne vous souciez pas beaucoup de savoir si l'arrondi est supérieur ou inférieur. Mais si vous voulez un arrondi précis, alors vous devez prendre en compte la précision attendue des valeurs. Les valeurs en virgule flottante ont une représentation binaire en interne. Cela signifie qu'une valeur comme 2,77395 n'a pas réellement cette valeur exacte en interne. Elle peut être légèrement supérieure ou légèrement inférieure. Si la valeur interne est légèrement inférieure, elle ne sera pas arrondie à 2,7740. Pour remédier à cette situation, vous devez être conscient de la précision des valeurs avec lesquelles vous travaillez, et ajouter ou soustraire cette valeur avant d'arrondir. Par exemple, si vous savez que vos valeurs sont précises jusqu'à 6 chiffres, pour arrondir des valeurs à mi-chemin, ajoutez cette précision à la valeur :
Double d = n.doubleValue() + 1e-6;
Pour arrondir vers le bas, soustrayez la précision.
[1] : http://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html#setRoundingMode(java.math.RoundingMode) [2] : http://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html
En supposant que valeur
est un double
, vous pouvez faire :
(double)Math.round(value * 100000d) / 100000d
C'est pour une précision de 5 chiffres. Le nombre de zéros indique le nombre de décimales.