Question

Je ne vois pas le résultat escompté avec Math.Round.

return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97

Si je comprends bien MidpointRounding.ToEven, les 5 en millièmes devraient entraîner une sortie de 99,96. N'est-ce pas le cas?

J'ai même essayé cela, mais il a aussi renvoyé 99,97:

return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100;

Qu'est-ce qui me manque

Merci!

Était-ce utile?

La solution

Vous n'êtes pas vraiment à mi-chemin. MidpointRounding.ToEven indique que si vous aviez le numéro 99,965 , c'est-à-dire 99,96500000 [etc.], puis , vous obtiendrez 99,96. Comme le nombre que vous transmettez à Math.Round se situe au-dessus de ce point médian, il est arrondi.

Si vous souhaitez que votre nombre soit arrondi à 99,96, procédez comme suit:

// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);

Et hé, voici une petite fonction pratique pour faire ce qui précède dans les cas généraux:

// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
    double multiplier = Math.Pow(10.0, digits + 1);
    double truncated = Math.Truncate(value * multiplier) / multiplier;
    return Math.Round(truncated, digits, mode);
}

Autres conseils

Il arrondit uniquement à 99,96 si vous vous trouvez au milieu même, c'est-à-dire 99,965:

C:\temp>ipy
IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.4927
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import Math, MidpointRounding
>>> Math.Round(99.9651, 2, MidpointRounding.ToEven)
99.97
>>> Math.Round(99.965, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.9649, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.975, 2, MidpointRounding.ToEven)
99.98
>>>

La valeur MidpointRounding entre en jeu uniquement lorsque vous essayez d'arrondir une valeur dont le chiffre le moins significatif est exactement 5. En d'autres termes, la valeur doit être 99.965 pour obtenir le résultat souhaité. Comme ce n'est pas le cas ici, vous observez simplement le mécanisme d'arrondi standard. Consultez la page MSDN pour plus d'informations.

Voici les résultats qui éclairent un peu le sujet:

Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
Math.Round(99.965, 2, MidpointRounding.ToEven);      // returning 99.96
Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96

Le point médian est exactement 5 ... pas 535789, pas 499999.

L’arrondi du point médian n’est examiné que si la valeur est comprise entre vos deux cas.

Dans votre cas, ce n'est pas "5", c'est "535 ...", il est donc supérieur au point médian et les routines sont égales à 0,96. Pour obtenir le comportement que vous attendez, vous devez lier le point à la troisième décimale, ALORS arrondir à l'aide de MidpointRounding.ToEven.

Math.Round 'Arrondit une valeur décimale à un nombre spécifié de chiffres fractionnaires.' en arrondissant 99,96500000,2 arrondis à 99,96 et 99,96500001 à 99,67. Il arrondit la valeur complète.

Si c'était moi, je n'utiliserais pas Math.Round () , car ce n'est pas ce que vous essayez d'accomplir.

Voici ce que je ferais:

double num = 99.96535789;
double percentage = Math.Floor(100 * num) / 100;  

Ce qui est beaucoup plus facile à lire et s’apparente davantage à une approche mathématique.
Je multiplie le nombre par 100 . Maintenant, j'ai 9996.535789 .
Ensuite, mettez-la au sol, ce qui diffère nettement de l'arrondi, pour renvoyer le plus petit entier le plus proche du nombre, afin d'obtenir 9996 .
Je divise ensuite par 100 pour obtenir le 99,96 requis .

P.S.
Floor est l'opposé de ceiling , qui renvoie le plus grand entier le plus proche du nombre.
Ainsi, le plafond de 9996.535789 est 9997 .
Les deux sont différents de arrondi à aucun point décimal, ce qui renvoie en fait le nombre entier le plus proche du nombre, qu'il soit plus petit ou plus grand - celui qui est le plus proche; c'est pourquoi vous obteniez 99,97 lorsque vous utilisiez arrondi .

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