Pourquoi ne Convertir.ToInt32 (ronds) le plus proche, même numéro, à la place de l'entier le plus proche?
À la recherche, à la documentation msdn pour Convert.ToInt32()
il déclare:
Si la valeur est à mi-chemin entre deux nombres entiers, le même nombre est
retourné, qui est, à 4.5 est converti à 4 et 5.5 est converti à 6.
http://msdn.microsoft.com/en-us/library/ffdk7eyz.aspx
Pourquoi est-ce?
Assurément, il serait plus logique d'arrondir au nombre entier le plus proche, ne serait-il pas? Si oui, 4.5 deviendrait 5 et 5.5 deviendrait 6, qui semble être plus intuitive.
- Si vous voulez le comportement spécifique de l'utilisation de la
Math.Round
méthode. Bien sûr, Convertir.ToInt32() ne l'utilisent déjà cette méthode avec le comportement décrit. Il a à voir avec des moyennes, vous convertir et ajouter les 6 numéros, et la moitié d'entre eux sont arrondis vers le bas et l'autre moitié sont roudned au maximum, vous obtenez un nombre plus précise, puis, si tout a été arrondis vers le haut ou arrondi vers le bas. - J'apprécie, je suis juste curieux de savoir pourquoi a même une préférence plus étrange dans tout scénario
- C'est juste une méthode existante. Il n'y a aucune raison pourquoi les banquiers arrondissement ne pouvais pas avoir favorisé va bizarres à la place. L' .NET de la mise en œuvre est tout simplement piggy-backing hors de quelque chose qui existe déjà.
- en.wikipedia.org/wiki/Bankers_rounding#Round_half_to_even
- Quand vous dites "Assurément, il serait plus logique d'arrondir au nombre entier le plus proche?", tout le problème est qu'il y a deux 'l'entier le plus proche de nombres...
- Retourne l'entier le plus proche, mais il y a deux de ceux-ci.
- La réponse simple à votre question, il serait moins précise. Même si elles ont été à tour la plus proche bizarre, que serait seuil impliquer l'arrondissement jusqu'à la moitié du temps et de l'arrondi vers le bas la moitié du temps. Votre question à partir d'une logique de point de vue ne fait pas de sens. Quand j'ai parlé de la Convertir.ToInt32 à l'aide de "cette méthode", je parlais du comportement décrit dans la documentation de ne pas
Math.Round
. Oui je downvoted à cette question, il semble que vous voulez avoir une discussion sur les raisons pour lesquelles la méthode fonctionne de cette façon, ce qui semble sorte de inutile d'en débattre. - Cheers, je pense que j'ai passé tellement de temps à voir ".5" les chiffres étant arrondis, que j'ai oublié son n'en fait plus proche du nombre entier haha.
- Je pense que cela est souvent dû à la plupart des écoles (au moins en Angleterre) seulement l'enseignement de l'arrondissement où .5 signifie "aller". Je suis tombé dans la "ce que le diable se passe ici?" piège avec les Banquiers de l'arrondissement.
- Il est également enseigné aux états-unis. Si le nombre est inférieur à 5 autour de vous, si son ci-dessus .5 alors vous arrondir. Si son .5 exactement alors entièrement à vous. Toujours arrondissement est peuvent entraîner un certain nombre qui n'est pas tout à fait exacte
- Dans ce cas, il est différent de ce que j'ai dit. On nous a appris que la décision de .5 était à "monter" par défaut pour des raisons de cohérence.
- pour vous" semble un peu blasé
- J'ai voté en faveur de la réouverture, comme cela semble une très bonne question. C'est à propos d'une raison pour le comportement observé, qui est responsable.
Vous devez vous connecter pour publier un commentaire.
La section Historique de l'article de Wikipédia pour L'arrondissement a quelques déclarations sur le rôle de "tour de de même" dans le calcul. Fait intéressant, il semble "Banquiers Arrondissement" a peu de preuves à l'état, il a été fonctionnaire dans tous les sens du mot, ne peut donc être écrit à la craie que l'argot de la terminologie.
C'est seulement un "plus logique" si vous vous abonnez à cet arrondissement mécanisme. Les banquiers d'arrondi (qui est la valeur par défaut dans ce cas) est parfaitement logique.
Imaginez si les banques arrondi au centime le plus proche pour chaque fraction, ils feraient beaucoup moins (perdre beaucoup de, pour le cynique) de l'argent avec des millions et des millions de transactions traitées chaque jour. OK, donc cet exemple est cynique.
En allant vers la plus proche nombre pair (ou impair, mais l'histoire a choisi autrement que pas chaque arrondissement de la résolution va jusqu', certains peuvent maintenant aller bas. Lorsque vous mettez ce la loi de la moyenne, il devient une solution équitable à utiliser lors de l'examen qui est responsable de payer un supplément pour la demi-penny.
Quant à savoir pourquoi il a été choisi pour le cadre, cette question vise à aborder:
Pourquoi ne .NET, utilisez l'arrondi par défaut?
Bien sûr, tout cela fait écho à des financiers jours et son applicabilité à l'intégrale des numéros de pourrait être remis en question, mais pourquoi s'embêter? L'accepter, le remplacer si vous le souhaitez, il suffit de comprendre comment il fonctionne.
Pour les gens qui se demandent comment faire pour modifier l'arrondi par défaut:
Si vous fournissez un non-entier
Convert.ToInt32
vous aurez d'abord besoin de faire quelque chose commeConvert.ToDouble
et puisMath.Ronde
avec la surcharge de changer la logique de l'arrondi.C'est exactement pourquoi le
MidpontRounding
surcharge a été ajouté àMath.Ronde
.Donc pour l'arrondi correct, vous devez utiliser les Mathématiques.Ronde plutôt que de Convertir.ToInt32.
Sans considérer le caractère subjectif de la question de savoir si MidpointRounding.ToEven (l'arrondi) ou MidpointRounding.AwayFromZero serait une meilleure défaut.
Lors de la conception de cela, Microsoft aurait considéré les langues .NET a été conçu pour remplacer.
VB classique a toujours utilisé l'Arrondi par défaut.
C /C++ conversions tronquée lors de la coulée, et a des fonctions de la bibliothèque floor() et ceil() dans la bibliothèque d'exécution - mais (autant que je sache, peut-être mal) pas de fonction arrondi.
Java a de Maths.autour de la dans la documentation est décrit comme étant l'équivalent de Mathématiques.round(a+0.5). Ce qui est sans doute pas ce que la plupart des gens s'attendent à ce pour les nombres négatifs (-3.5 tours à -3).
VB développeurs peuvent sans doute s'attendre à besoin de plus d'assistance que les développeurs venant de C/C++ ou Java.
Par conséquent, il semble raisonnable que lors de la conception .NET, la bibliothèque de classe serait de fournir
Floor
,Ceiling
etRound
méthodes, et que le cycle de comportement par défaut de visual basic comportement.Il semble également raisonnable que Convertir.ToInt32() serait d'utiliser la Ronde méthode (même si je suppose que l'affaire pouvait être fait pour le Plancher, pour des raisons de cohérence avec la coulée).
Si vous voulez que le comportement que vous devez utiliser
Math.Ronde
et spécifierMidpointRounding.AwayFromZero
.Par exemple:
Démo: http://ideone.com/ZAbBL
Convertir.ToInt32(double)
ne pas utiliserMath.Round
lui-même, au lieu de cela, il est mis en œuvre dans cette voie (ILSpy):