double a = 18.565 return Math.Round(a,2) ..returns 18.57. For every other number I tried banker's rounding worked as expected, for example Math.Round(2.565,2) returned 2.56.Any clue why and when that happens? Is it error or am I missing something about banker's rounding?Thanks..
4 Réponses :
18.565 ne peut pas être exactement représenté comme un double. Ainsi, la représentation binaire est légèrement supérieure, de sorte qu'il arrive. Si vous utilisez décimal: Il peut être exactement représenté, et vous n'aurez pas ce problème. P> p>
Comme dit Matthieu, 18,565 ne peut pas être représenté avec précision. La valeur réelle utilisée est 18.565000000000001278976924368180334568023681640625 (trouvé en utilisant DoubleConverter ), ce qui est nettement au-delà de la moitié -manière. Maintenant, j'ai un sentiment faufilant que parfois em> Même la valeur arrondie est pas exactement 18,57 bien sûr. Il est en fait 18,57000000000000028421709430404007434844970703125. P> Fondamentalement, si vous avez vraiment, vraiment à représenter des valeurs décimales avec précision, vous devez utiliser Ce Finalité em> donner la bonne valeur pour Math.Round code>, bien sûr: p> Math.Round code> examinera une valeur qui est en fait em> au-delà du point à mi-chemin, mais qui est au plus près du point à mi-chemin comme on peut le représenter avec précision, comme étant exactement à em> ce point. Cependant, je ne l'ai pas vu aucun document décrivant les situations dans lesquelles qui est appliqué, et clairement il ne se passe dans ce cas. Je ne voudrais pas compter sur elle.
décimal code>. Ce n'est pas seulement en termes de
Math.Round code> -. Il va à tous les aspects de la gestion des valeurs à virgule flottante p>
decimal m = 18.565m;
Console.WriteLine(Math.Round(m, 2)); // Prints 18.56
HM, eh bien, c'était la première chose que j'ai pensée et vérifié dans un convertisseur en ligne ( BABBAGE.CS.QC.EDU/IEEE-754/DECIMAL.HTML ). Bien sûr, n'a pas accordé beaucoup d'attention au fait que seules les premières décimales sont visibles, tous les zéros. Hein, merci :)
Je suppose que la représentation de la FP signifie que ce n'est pas en réalité une traînée 5; Les dangers de FP!
Cela fonctionne bien, bien que: p>
double est une valeur de point flottante, alors peut-être que si vous l'écrivez comme 18.565, c'est en mémoire quelque chose comme 18.565000000000000000000000000000000000001, et c'est donc plus que le point médian. P>
Dupliqué possible de Obtenir un résultat différent en maths.Round