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

Selon la documentation, la décimal.Ronde 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.

  • > je m'attends à 72,5, mais le résultat est de 72,4 je ne le ferais pas. Vous dites que vous auriez ronde 2.444444444444444449 jusqu'à trois? (Si vous avez été arrondi à zéro décimale)
  • L'arrondi n'est pas "plus naturel". La Nature n'a rien à faire avec elle. C'est tout simplement ce que vous avez appris à gradeschool lorsque vous avez appris le concept de "l'arrondissement." Gradeschool leçons ne sont pas toujours peindre un tableau complet.
  • Et c'est pourquoi il est plus naturel, même si elle n'est pas correcte
  • Je ne comprends pas, @Pacerier. J'ai expliqué pourquoi il n'est pas naturel, et vous dire que c'est en fait pourquoi il est naturel. Comment est-ce que mon argument de travail contre ma conclusion, qui est à l'opposé de la vôtre? Des choses que vous avez pris l'habitude de pourrait se sentir naturel, et nous avons parfois au sens figuré dire que quelque chose est "seconde nature", mais qui n'est pas naturel.
  • Je dis que c'est naturel, parce que c'est naturel. Vous savez qu'il y a 36 différents objets avec le même nom de variable de droit naturel?
  • la nature est sans aucun doute l'analogique donc c'est le bon mot à utiliser, mais c'est pédant. Peut-être que "comme d'habitude" serait un meilleur terme à utiliser.."qu'est-ce que l'habitude d'arrondi que les gens ne" > va de 0,5 à 1,0
  • BTW, il est intéressant de noter que lors de l'arrondi d'un double lors de la conversion d'une chaîne de caractères, AwayFromZero arrondissement est utilisé (c'est à dire 0.5.ToString("0") == "1"). Je pense que généralement, quand autour de vous, vous le faites pour afficher la valeur sur l'écran. Donc, ce qui le rend vraiment intéressant.
  • Oui, je trouve aussi cela très étrange. Cette "incohérence", qui a été présent depuis le début de l' .NET. Voici un exemple supplémentaire pour ceux qui ne savent pas cela: Si d = 9.825m est un Decimal (exactement représentable, bien sûr), puis des trucs comme decimal.Round(d, 2) et Math.Round(d, 2) donne 9.82, alors que le formatage comme d.ToString("F2"), d.ToString("N2") et d.ToString("0.00") donne "9.83" (le caractère séparateur décimal en fonction de la culture du thread en cours). Pas très sympa.
  • Le seul raisonnement derrière ce que je peux penser, c'est que lorsque arrondir une valeur pour l'affichage sur l'écran, vous n'avez pas besoin de la statistique profit des banquiers de l'arrondissement. Le plus "naturel" à l'écart à partir de zéro arrondi pourrait être la meilleure option. D'où la chaîne de conversions en rond comme ça. Lors de l'arrondi des valeurs qui doivent être utilisés dans d'autres calculs, alors la statistique profit des banquiers arrondissement est utile. Exactement le genre de situation où vous utiliseriez Math.Round.
  • Hors-sujet: les Banquiers arrondissement est censé être impartial, ce qui est en théorie. Mais dans la pratique, il y a beaucoup plus de nombres (dans le monde de la finance), ce qui le rend discutable
  • Il est vrai que beaucoup de prix à la fin avec 9, mais qui n'a pas vraiment de parti pris. Par exemple, le prix peut être avec ou sans taxe(es) et autres. Et bien sûr, plus les prix sont souvent pas 9 serions les derniers chiffres (avant la finale à 5). Dans l'ensemble, dans toutes les applications financières, dont je faisais partie jusqu'à présent, l'arrondi de grandes œuvres.
  • Dans les applications bancaires, dans la grande majorité des situarions, vous êtes juste de faire un grand nombre de débats. Chaque sommation peut potentiellement ajouter une erreur pour la suite. Afin de minimiser l'erreur, l'algorithme utilisé ne doit pas être biaisée qui, en d'autres termes, signifie qu'il doit parfois ronde, parfois arrondi à l'inférieur. Il n'a pas vraiment d'importance ce que fait votre cerveau une sensation naturelle. Ce qui importe vraiment est la nécessité imposée par un certain cas d'utilisation ou d'exigence. Si les banquiers ronde est sans doute la meilleure solution pour le problème... et bien... c'est naturel pour l'utiliser!
  • Par la manière, les applications financières (écrit par le bien de développeurs compétents, je veux dire) emploient point fixe de l'arithmétique, de ne pas arithmétique à virgule flottante. Employant point fixe de l'arithmétique, tous les calculs sont précis et il n'y a pas d'erreurs d'arrondi à tous.