9
votes

C # Erreur d'arrondi par le banquier

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..

1 commentaires

4 Réponses :


5
votes

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: xxx

Il peut être exactement représenté, et vous n'aurez pas ce problème.


0 commentaires

17
votes

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> 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.

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 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>

Ce Finalité em> donner la bonne valeur pour Math.Round code>, bien sûr: p>

decimal m = 18.565m;
Console.WriteLine(Math.Round(m, 2)); // Prints 18.56


1 commentaires

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 :)



1
votes

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: xxx


0 commentaires

0
votes

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.


0 commentaires