1
votes

Arrondir à la moitié d'une décimale inférieure

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 .

Sinon, y a-t-il un moyen simple de le faire?


4 commentaires

@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 , mais 1.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 non double . Si vous utilisez double , 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 :-)


3 Réponses :


1
votes

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

Voici la documentation complète .


0 commentaires

4
votes

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


3 commentaires

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.



0
votes

Vous pouvez utiliser Math.Round

    decimal d = Convert.ToDecimal("1.266");
    Console.WriteLine(Math.Round(d, 2));

    Console.ReadLine();


0 commentaires