Je veux une méthode d'arrondi sur les valeurs doubles en C#. Il doit être capable d'arrondir une double valeur à toute valeur de précision d'arrondi. Mon code à la main ressemble:Arrondir les valeurs doubles en C#
public static double RoundI(double number, double roundingInterval) {
if (roundingInterval == 0.0)
{
return;
}
double intv = Math.Abs(roundingInterval);
double sign = Math.Sign(number);
double val = Math.Abs(number);
double valIntvRatio = val/intv;
double k = Math.Floor(valIntvRatio);
double m = valIntvRatio - k;
bool mGreaterThanMidPoint = ((m - 0.5) >= 1e-14) ? true : false;
bool mInMidpoint = (Math.Abs(m - 0.5) < 1e-14) ? true : false;
return (mGreaterThanMidPoint || mInMidpoint) ? sign * ((k + 1) * intv) : sign * (k * intv);
}
Ainsi RoundI (100, 3) devrait donner 99 et RoundI (1,2345, 0,001) devrait donner 1,235.
Le problème est que RoundI (1.275, 0.01) renvoie 1.27 au lieu de 1.28. C'est parce que lors de l'exécution double valIntvRatio = val/intv, c'est-à-dire double valIntvRatio = 1.275/0.01, il donne 0.12749999999999. Je sais que c'est un problème avec la double représentation dans n'importe quel langage de programmation. Ma question est, y a-t-il un code standard pour faire des choses comme ça, sans avoir à se soucier de la précision sur le double? Ici, je mets le tolérant à 1e-14, mais c'est trop restrictif pour ce problème et je ne sais pas quelle est la tolérance correcte à régler. Merci pour toute aide.
Vous devriez peut-être envisager d'utiliser le type de données Decimal. – Kibbee
Pourquoi arrondir (100,3) donner 99? Si vous arrondissez à la même position fractionnaire que les 3 (0 places), vous obtiendrez 100, pas 99. – paxdiablo
paxdiablo: désolé, le but de RoundI est de ne pas arrondir pour arrondir le premier paramètre à la même position fractionnaire comme le deuxième paramètre. Le deuxième paramètre est l'intervalle rond et l'arrondi arrondit le premier paramètre à la valeur de placard qui a le mode 0 au deuxième paramètre. – Steve