Existe-t-il un équivalent de Java RoundingMode.HALF_DOWN
en C #?
Par exemple, je veux arrondir 1.265
à 1.26
et 1.266
à 1.27
. p >
Sinon, y a-t-il un moyen simple de le faire?
3 Réponses :
Utilisez la méthode .Round
avec la surcharge de constructeur suivante:
Math.Round(value, 2, MidpointRounding.AwayFromZero);
Appelez comme ceci:
public static double Round (double value, int digits, MidpointRounding mode);
Jetez un œil à Math.Round par exemple
1.265 -> 1.26 1.266 -> 1.27
Résultat:
double[] tests = new double[] { 1.265, 1.266, }; var demo = tests .Select(x => $"{x} -> {Math.Round(x, 2, MidpointRounding.AwayFromZero)}"); var report = string.Join(Environment.NewLine, demo); Console.Write(report);
Le double
littéral 1.265
n'a pas la valeur 1.265; il s'agit de 1.26499998569488525390625. Donc, ce code ne démontre pas qu'il exécute la fonction souhaitée.
Il est impossible de représenter 1.265
sans perte de précision: 1.265.ToString ("R")
. Hélas 1/10
est une fraction périodique en binaire et c'est pourquoi 1.265 == 1 + 265/1000
ne peut pas être représenté exactement
Oui, c'est impossible. C'est pourquoi les chiffres de cette réponse ne permettent pas de démontrer si Round
arrondit un point médian exact comme souhaité. Vous pouvez à la place utiliser des nombres possibles, comme 1,375 ou 1,625.
Vous pouvez utiliser Math.Round
decimal d = Convert.ToDecimal("1.266"); Console.WriteLine(Math.Round(d, 2)); Console.ReadLine();
@KayNelson: Je n'ai pas voté, mais une des raisons possibles est que la question est impossible. 1.265 peut être représenté exactement en C # avec le littéral
décimal
1.265m
, mais1.265
est un littéral binaire à virgule flottante dont la valeur est 1.26499998569488525390625, donc la question d'arrondir une valeur exactement à mi-chemin entre les objectifs ne s'applique pas.@EricPostpischil Merci pour vos commentaires. C'est quelque chose que je ne savais pas. Avez-vous une idée de la façon dont je peux contourner le problème?
@KBell: Vous auriez à décrire plus en détail le problème dans son ensemble. Si vous lisez des chiffres décimaux dans du texte et que vous souhaitez les arrondir, utilisez
decimal
ou texte de caractère, et nondouble
. Si vous utilisezdouble
, vous utilisez une virgule flottante basée sur binaire et avez probablement une variété d'erreurs d'arrondi en arithmétique, donc vous ne vous attendez généralement pas du tout à des résultats décimaux exacts.Oui mais ce n'est toujours pas une raison pour rejeter la question que je dirais :-)