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 unDecimal
(exactement représentable, bien sûr), puis des trucs commedecimal.Round(d, 2)
etMath.Round(d, 2)
donne9.82
, alors que le formatage commed.ToString("F2")
,d.ToString("N2")
etd.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.
Vous devez vous connecter pour publier un commentaire.
Probablement en raison d'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.
MidpointRounding.ToEven
peut donner des résultats plus précis.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 la 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 les La norme IEEE 754 standard. Cela est également mentionné dans MSDN pour les Mathématiques.Ronde dans les Remarques.
Aussi noter que .NET prend en charge la méthode de rechange spécifiées par l'IEEE en fournissant les
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.Alors 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.Ronde
vous permet de spécifier unMidpointRounding
: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.
Banquiers arrondissement ont l'avantage qu'en moyenne, vous obtiendrez le même résultat si vous:
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)
Decmial
s, oui. Décimales, pas. Pour la postérité, je suis d'accord avec l'original sentiment ici.Utiliser une autre surcharge de fonction comme ceci:
Il sera de sortie 3. Et si vous utilisez
vous obtiendrez l'arrondi.
Aussi, remarque que "l'arrondi" à partir d'un format de chaîne de caractères (comme "0") produit un résultat différent de celui des Mathématiques".Round()". À savoir, que 5, .5, etc.. est toujours arrondi: