290 votes

Pourquoi ne .NET, utilisez l'arrondi par défaut?

Selon la documentation, l' decimal.Round méthode utilise un rond-de-même algorithme qui n'est pas commun pour la plupart des applications. Donc, je finis toujours par écrire une fonction personnalisée pour faire le choix le plus naturel ronde demi-jusqu'algorithme:

public static decimal RoundHalfUp(this decimal d, int decimals)
{
    if (decimals < 0)
    {
        throw new ArgumentException("The decimals must be non-negative", 
            "decimals");
    }

    decimal multiplier = (decimal)Math.Pow(10, decimals);
    decimal number = d * multiplier;

    if (decimal.Truncate(number) < number)
    {
        number += 0.5m;
    }
    return decimal.Round(number) / multiplier;
}

Quelqu'un sait la raison derrière cette conception du cadre de décision?

Est-il intégré dans la mise en œuvre de la ronde demi-jusqu'algorithme dans le cadre? Ou peut-être que certains non géré API Windows?

Il pourrait être trompeur pour les débutants que simplement écrire decimal.Round(2.5m, 0) attend 3 comme un résultat, mais avoir 2 à la place.

454voto

Ostemar Points 3811

Les autres réponses les raisons pour lesquelles le Banquier de l'algorithme (aka ronde demi-même) est un bon choix sont tout à fait correct. Il ne souffre pas de négatif ou de positif biais autant que le tour de la moitié de l'écart de zéro méthode la plus raisonnable des distributions.

Mais la question était de savoir pourquoi .NET use du Banquier réelle d'arrondi par défaut - et la réponse est que Microsoft a suivi la norme IEEE 754 la norme. Cela est également mentionné dans MSDN pour les Mathématiques.Tour dans les Remarques.

Notez également que .NET prend en charge la méthode de rechange spécifiées par l'IEEE en fournissant l' MidpointRounding énumération. Ils pourraient bien sûr, ont fourni plus de solutions de rechange à la résolution des liens, mais ils choisissent de simplement répondre à la norme IEEE.

208voto

Kibbee Points 36474

Probablement parce que c'est un meilleur algorithme. Au cours de nombreuses arrondis effectués, vous sera en moyenne que tous .5 la fin, l'arrondissement également en haut et en bas. Cela donne de meilleures estimations des résultats réels si vous êtes, par exemple, l'ajout d'un tas de chiffres arrondis. Je dirais que, même si ce n'est pas ce que l'on peut s'y attendre, il est probablement le plus la chose correcte à faire.

90voto

Michael Stum Points 72046

Bien que je ne peux pas répondre à la question de "Pourquoi Microsoft, les concepteurs de choisir ce que la valeur par défaut?", Je veux juste faire remarquer qu'une fonction supplémentaire est inutile.

Math.Round vous permet de spécifier un MidpointRounding:

  • ToEven - Lorsqu'un numéro est à mi-chemin entre les deux autres, il est arrondi vers le plus proche, même numéro.
  • AwayFromZero - Lorsqu'un numéro est à mi-chemin entre les deux autres, il est arrondi vers le plus proche qui est loin de zéro.

22voto

Ian Ringrose Points 19115

Les décimales sont principalement utilisés pour de l'argent; l'arrondi est commun lorsque l'on travaille avec de l'argent. Ou vous pourriez dire.

Il est la plupart du temps les banquiers qui ont besoin de type décimal; par conséquent, il n' "l'arrondi"

Les banquiers arrondissement ont l'avantage qu'en moyenne, vous obtiendrez le même résultat si vous:

  • autour d'un ensemble de "lignes de facture" avant d'ajouter,
  • ou ajouter ensuite le tour du total

Arrondissement avant d'ajouter jusqu'a sauvé beaucoup de travail dans les jours avant les ordinateurs.

(Au royaume-UNI lorsque nous sommes allés décimal banques ne traiterait pas avec des demi-pence, mais pour de nombreuses années, il y avait encore une demi-pence pièce et magasin souvent a des prix se terminant en demi-pence – beaucoup de arrondissement)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X