2009-03-11 7 views

Répondre

68

Utilisez Math.round(), éventuellement en association avec MidpointRounding.AwayFromZero

par exemple:

Math.Round(1.2) ==> 1 
Math.Round(1.5) ==> 2 
Math.Round(2.5) ==> 2 
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3 
+5

Est-ce que 'Convert.ToInt32()' ne fera pas la même chose, ou est-ce que tout simplement enlever tout après la décimale? –

+144

Ne produit pas réellement un entier, mais un double. – gatopeich

+0

Je pense qu'il y a une contradiction (c'est-à-dire une erreur) entre les lignes 2 et 3 ci-dessus, non? – Ronnie

188
double d = 1.234; 
int i = Convert.ToInt32(d); 

Reference

Poignées arrondi comme ceci:

arrondi à l'entier signé 32 bits le plus proche. Si la valeur est à mi-chemin entre deux nombres entiers, le nombre pair est renvoyé; à savoir, 4,5 est converti en 4 et 5,5 est convertie en 6.

+5

Beaucoup mieux que 'Math.Round' car il retourne un int comme requis. – Keith

+5

@Keith: Mais il invalide ** pair.5 ** à * pair * au lieu de * même + 1 * ... –

+7

@ robert-koritnik. Je ne sais pas pourquoi c'est "invalide". OP n'a pas spécifié de règle d'arrondi préférée, et «round .5 à pair pair» est la règle standard de retour en arrière. Toujours arrondir a des effets statistiques indésirables. – Keith

8
double d; 
int rounded = (int)Math.Round(d); 
0

Je développe une calculatrice scientifique qui arbore un bouton Int. J'ai trouvé ce qui suit est une solution simple et fiable:

double dblInteger; 
if(dblNumber < 0) 
    dblInteger = Math.Ceiling(dblNumber); 
else 
    dblInteger = Math.Floor(dblNumber); 

Math.Round produit parfois des résultats inattendus ou indésirables, et la conversion explicite en entier (par coulée ou Convert.ToInt ...) produit souvent des valeurs erronées pour des nombres plus précis. La méthode ci-dessus semble toujours fonctionner.

+1

Est-ce que ça arrondit tout négatif et arrondit tous les nombres positifs? Ce n'est pas nécessairement le nombre "le plus nul". –

+0

ce n'est pas le nombre le plus proche. –

+0

Étant donné 1,99, cela renvoie 1.0. –

31

Vous pouvez également utiliser la fonction:

//Works with negative numbers now 
static int MyRound(double d) { 
    if (d < 0) { 
    return (int)(d - 0.5); 
    } 
    return (int)(d + 0.5); 
} 

Selon l'architecture, il est plusieurs fois plus rapide.

+0

C'était parfait pour moi car Math.Round ne fonctionnait pas comme je le voulais. – Johannes

+0

@cullub oui c'est le cas. Il convertit le double d qui lui avait été ajouté en un nombre entier. – Darrell

+0

Ceci est ma méthode préférée - fonctionne d'une manière très simple. Beaucoup plus court et plus facile à lire que Math.Round (d, MidpointRounding.AwayFromZero) et plus concis que d'utiliser une instruction if pour choisir d'arrondir ou non l'arrondi. ET, retourne effectivement un entier à la fin, pas un double – binderbound

4

Je sais que cette question est ancienne, mais je suis tombé dessus dans ma recherche de la réponse à ma question similaire. J'ai pensé partager le conseil très utile que j'ai reçu.

Lors de la conversion en int, il suffit d'ajouter .5 à votre valeur avant le downcasting. Comme downcasting à int descend toujours au nombre inférieur (par exemple (int) 1.7 = 1), si votre nombre est .5 ou plus, ajouter .5 l'amènera dans le numéro suivant et votre downcast à int devrait retourner la valeur correcte . (par exemple (int) (1,8 + 0,5) = 2)

J'espère que cette réponse sera utile à tous.

+12

Le problème est si vous essayez de convertir les valeurs négatives de cette façon. Par exemple -1.25 finira par égal à 0. (-1.25 + 0.5 = 0.75, et une fois jeté à int c'est 0). Vous devez donc soustraire 0,5 des valeurs négatives. – Eternal21