Question

double a = 18.565
return Math.Round(a,2)

.. 18,57 retours.
Pour tout autre nombre que j'ai essayé arrondi a fonctionné comme prévu, par exemple de banquier Math.Round (2.565,2) est retourné 2,56.

Un indice pourquoi et quand cela se produit? Est-il erreur ou suis-je manque quelque chose l'arrondi?

Merci ..

Était-ce utile?

La solution

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é -façon. Maintenant, j'ai un sentiment faufilant que parfois Math.Round examinera une valeur qui est en fait au-delà du point à mi-chemin, mais qui est aussi proche du point à mi-chemin comme peut être représenté avec précision, comme étant exactement à 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.

Fondamentalement, si vous avez vraiment, vraiment à représenter des valeurs décimales avec précision, vous devriez utiliser decimal. Ce n'est pas seulement en termes de Math.Round -. Il va à tous les aspects de la gestion des valeurs à virgule flottante

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

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

Autres conseils

18,565 ne peut pas être représenté exactement comme un double. Ainsi, la représentation binaire est légèrement plus élevé, il arrondit. Si vous utilisez décimales:

decimal a = 18.565m;
return Math.Round(a,2)

il peut être représenté exactement, et vous pas ce problème.

Je suppose que les moyens de représentation de FP, il est pas vraiment un 5 arrière; les dangers de la FP!

Ce beau de travaux, bien que:

        decimal a = 18.565M; // <===== decimal
        var s = Math.Round(a, 2);

Double est une valeur en virgule flottante, alors peut-être si vous écrivez comme 18,565, il est en fait quelque chose de mémoire comme 18,56500000000000000000000000000000001, et il est donc plus que le point central.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top