Comment arrondir au nombre entier le plus proche en C #

Réponses:

200

Consultez la documentation officielle pour en savoir plus. Par exemple:

En gros, vous donnez à la Math.Roundméthode trois paramètres.

  1. La valeur que vous souhaitez arrondir.
  2. Le nombre de décimales que vous souhaitez conserver après la valeur.
  3. Un paramètre facultatif que vous pouvez appeler pour utiliser l'arrondi AwayFromZero. ( ignoré sauf si l'arrondi est ambigu, par exemple 1.5 )

Exemple de code:

var roundedA = Math.Round(1.1, 0); // Output: 1
var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2
var roundedC = Math.Round(1.9, 0); // Output: 2
var roundedD = Math.Round(2.5, 0); // Output: 2
var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3
var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3

Démo en direct

Vous en avez besoin MidpointRounding.AwayFromZerosi vous voulez qu'une valeur de .5 soit arrondie. Malheureusement, ce n'est pas le comportement par défaut pour Math.Round(). Si vous utilisez MidpointRounding.ToEven(valeur par défaut), la valeur est arrondie au nombre pair le plus proche ( 1.5est arrondie à 2, mais 2.5est également arrondie à 2).

Seulement bolivien ici
la source
14
d'autre part, utiliser away from zerosignifie également que -1.5sera arrondi à -2.
davogotland
2
utilisez Math.Ceiling, ce n'est pas une bonne pratique d'utiliser Math.Round pour les frictions, lisez: stackoverflow.com/questions/9221205/… ,
Yakir Manor
3
Je trouve que Math.Round (1.5, 0) renvoie 2
David Sykes
@davogotland est-il de toute façon pour arrondir 137,5 à 140 et non à 138? Je veux dire arrondir au dixième près?
sam
1
@sam peut-être diviser par 10, puis arrondir avec Math.Ceiling, et enfin multiplier par 10?
davogotland
63
Math.Ceiling

arrondit toujours vers le haut (vers le plafond)

Math.Floor

arrondit toujours vers le bas (vers le sol)

ce que vous recherchez est simplement

Math.Round

qui arrondit selon ce post

salles de développement
la source
est-ce de toute façon d'arrondir 137,5 à 140 pas à 138? Je veux dire arrondir au dixième près?
sam
7

Vous avez besoin Math.Round, non Math.Ceiling. Ceiling"arrondit" toujours vers le haut, tandis que les Roundarrondis vers le haut ou vers le bas selon la valeur après la virgule décimale.

dasblinkenlight
la source
6

il y a ce manuel, et assez mignon aussi:

double d1 = 1.1;
double d2 = 1.5;
double d3 = 1.9;

int i1 = (int)(d1 + 0.5);
int i2 = (int)(d2 + 0.5);
int i3 = (int)(d3 + 0.5);

ajoutez simplement 0,5 à n'importe quel nombre, et transtypez-le en int (ou plancher) et il sera mathématiquement arrondi correctement: D

Davogotland
la source
Cela semble toujours suspect. Tout d' abord, la question porte sur l' arrondissement en et d' autre part, quand je l'ai essayé tout à l' heure, l'implémentation par défaut de Math.Round (1,5) tours à 2. Donc , cela peut ne pas être ce qu'il voulait.
ver
De plus, votre exemple mélange la virgule décimale et la virgule décimale. Lequel utilisez-vous normalement (en Suède, je suppose)? :)
ver
oups ... oh ouais, désolé. dans la programmation du point décimal bien sûr, mais dans le texte formel, nous utilisons la virgule décimale. et oui, la suède ^^ à propos de la question, et de la partie "arrondir": je pense que c'est juste une erreur de langage. dans les exemples donnés par op, quelques nombres décimaux arrondis vers le bas.
davogotland
@ver je ne arrondis pas avec Math.Round, je le fais avec un casting. c'est pourquoi cette méthode est manuelle et plutôt mignonne;)
davogotland
5

Vous pouvez utiliser Math.Round comme d'autres l'ont suggéré (recommandé), ou vous pouvez ajouter 0,5 et convertir en un entier (ce qui supprimera la partie décimale).

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2
Marlon
la source
5

Juste un rappel. Méfiez-vous du double.

Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999
Math.Round( 1.5 ) = 2
Kosmas
la source
3

Vous avez la fonction Math.Round qui fait exactement ce que vous voulez.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.
user496607
la source
1
Qu'en est-il 1.5de la valeur? Vous avez besoin de plus de paramètres.
Only Bolivian Here
2

cela arrondira au 5 le plus proche ou ne changera pas s'il est déjà divisible par 5

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}
meule
la source
2

Je cherchais ceci, mais mon exemple était de prendre un nombre, tel que 4.2769 et de le déposer dans une plage de 4,3. Pas exactement la même chose, mais si cela aide:

Model.Statistics.AverageReview   <= it's just a double from the model

Ensuite:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

etc...

user2970629
la source
J'utilise votre méthode car j'ai aussi besoin d'une chaîne et .ToString ("n0") s'occupe de l'arrondi pour moi: 1,5 m.ToString ("n0") // renvoie "2"
Nathan Prather
1

Utilisez Math.Round:

double roundedValue = Math.Round(value, 0)
Thomas Levesque
la source
1
var roundedVal = Math.Round(2.5, 0);

Cela donnera le résultat:

var roundedVal = 3
Ankita_systematix
la source
0

Si vous travaillez avec des nombres entiers plutôt que des nombres à virgule flottante, voici le chemin.

#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))

Ici, "numr" et "denr" sont des entiers non signés.

Sarath Kumar
la source
0

En utilisant des Math.Round(number)arrondis au nombre entier le plus proche.

codejockie
la source
0

Écrivez votre propre méthode ronde. Quelque chose comme,

function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end

Sandeep Anand
la source
-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
Salma
la source