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).


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


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.


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


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

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

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.

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);
}

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...


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



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.


0

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


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


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.