Come arrotondare al numero intero più vicino in C #


Risposte:


200

Vedere la documentazione ufficiale per ulteriori informazioni. Per esempio:

Fondamentalmente dai al Math.Roundmetodo tre parametri.

  1. Il valore che vuoi arrotondare.
  2. Il numero di decimali che vuoi mantenere dopo il valore.
  3. Un parametro opzionale che puoi invocare per usare l'arrotondamento AwayFromZero. ( ignorato a meno che l'arrotondamento non sia ambiguo, ad esempio 1.5 )

Codice di esempio:

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

Dimostrazione dal vivo

È necessario MidpointRounding.AwayFromZerose si desidera che un valore .5 venga arrotondato per eccesso. Sfortunatamente questo non è il comportamento predefinito per Math.Round(). Se si utilizza MidpointRounding.ToEven(impostazione predefinita) il valore viene arrotondato al numero pari più vicino ( 1.5viene arrotondato a 2, ma 2.5anche arrotondato a 2).


14
d'altra parte, usando away from zeroanche i mezzi che -1.5verranno arrotondati a -2.
davogotland

2
usa Math.Ceiling, non è una buona pratica usare Math.Round per gli attriti, leggi: stackoverflow.com/questions/9221205/… ,
Yakir Manor

3
Sto scoprendo che Math.Round (1.5, 0) restituisce 2
David Sykes

@davogotland è comunque loro che arrotondano 137,5 a 140 non a 138? Intendo arrotondare al decimo più vicino?
sam

1
@sam forse dividere per 10, poi arrotondare con Math.Ceiling e infine moltiplicare per 10?
davogotland

63
Math.Ceiling

arrotonda sempre per eccesso (verso il soffitto)

Math.Floor

arrotonda sempre per difetto (verso il pavimento)

quello che cerchi è semplicemente

Math.Round

che arrotonda come da questo post


è comunque loro arrotondare 137,5 a 140 non a 138? Intendo arrotondare al decimo più vicino?
sam

7

È necessario Math.Round, non è Math.Ceiling. Ceiling"arrotonda" sempre per eccesso, mentre Roundarrotonda per eccesso o per difetto a seconda del valore dopo il punto decimale.


6

c'è questo manuale, e anche un po 'carino:

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

aggiungi semplicemente 0,5 a qualsiasi numero e lancialo su int (o floor it) e sarà matematicamente arrotondato correttamente: D


Sembra ancora sospetto. In primo luogo, la questione chiede di arrotondamento in su e in secondo luogo, quando l'ho provato solo ora, l'implementazione predefinita di Math.round (1.5) giri a 2. Quindi questo potrebbe non essere quello che voleva.
ver

inoltre, il tuo esempio mescola il punto decimale con la virgola decimale. Quale usi normalmente (in Svezia, immagino)? :)
ver

oops ... oh sì, scusa. nella programmazione del punto decimale ovviamente, ma nel testo formale usiamo la virgola decimale. e sì, Svezia ^^ riguardo alla domanda e alla parte "arrotondamento": penso che sia solo un errore di lingua. negli esempi forniti da op, alcuni numeri decimali vengono arrotondati per difetto.
davogotland

@ver I don't round down with Math.Round, I do it with a cast. ecco perché in questo modo è manuale e piuttosto carino;)
davogotland

5

Puoi usare Math.Round come altri hanno suggerito (consigliato), oppure puoi aggiungere 0.5 e cast a un int (che lascerà cadere la parte decimale).

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

Solo un promemoria. Attenzione al doppio.

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

3

Hai la funzione Math.Round che fa esattamente quello che vuoi.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.

1
E 1.5il valore? Hai bisogno di più parametri.
Solo boliviano qui

2

questo verrà arrotondato al 5 più vicino o non cambierà se è già divisibile per 5

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

2

Lo stavo cercando, ma il mio esempio è stato quello di prendere un numero, come 4.2769 e rilasciarlo in un arco di tempo come solo 4.3. Non esattamente lo stesso, ma se questo aiuta:

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

Poi:

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

eccetera...


Sto usando questo tuo metodo perché ho bisogno anche di una stringa e .ToString ("n0") si occupa dell'arrotondamento per me: 1.5m.ToString ("n0") // restituisce "2"
Nathan Prather



0

Se lavori con numeri interi anziché numeri in virgola mobile, ecco il modo.

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

Qui sia "numr" che "denr" sono interi senza segno.


0

Utilizzo di Math.Round(number)arrotondamenti al numero intero più vicino.


0

Scrivi il tuo metodo circolare. Qualcosa di simile a,

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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.