2010-09-26 11 views
9

Questo dovrebbe essere facile, ma non riesco a trovare un metodo integrato nel metodo, il framework .net deve avere un metodo per farlo!Come arrotondare un decimale a 2 cifre decimali in .Net?

private decimal RoundDownTo2DecimalPlaces(decimal input) 
{ 
    if (input < 0) 
    { 
     throw new Exception("not tested with negitive numbers"); 
    } 

    // There must be a better way! 
    return Math.Truncate(input * 100)/100; 
} 
+0

Vuoi arrotondare il decimale stesso o una rappresentazione di testo? –

+0

@Henk, ho bisogno di mostrare il valore come testo, ma preferisco fare l'arrotondamento prima dell'output. È probabile che il valore debba essere inserito successivamente in altri calc. –

+0

possibile duplicato di [Arrotondare un doppio a 2 cifre significative dopo il punto decimale] (http: // stackoverflow.it/questions/2808535/round-a-double-to-2-significant-figures-after-decimal-point) – ecatmur

risposta

0

Non esiste alcun metodo di costruzione nel framework .net per fare ciò, altre risposte dicono come scrivere il proprio codice.

2
Math.Floor(number * 100)/100; 
+0

burro quindi la mia soluzione, come Math.Floor dare il risultato corretto con numeri negativi. vedere http://stackoverflow.com/questions/14/whats-the-difference-tra between-math-floor-and-math-truncate-in-net –

3

Usa .Truncate() per ottenere importo esatto, o .Round() per arrotondare.

decimal dNum = (decimal)165.6598F; 
decimal dTruncated = (decimal)(Math.Truncate((double)dNum*100.0)/100.0); //Will give 165.65 
decimal dRounded = (decimal)(Math.Round((double)dNum, 2)); //Will give 165.66 

Oppure si può fare un metodo di estensione per eseguirlo come dNum.ToTwoDecimalPlaces();

public static class Extensions 
{ 
    public static decimal ToTwoDecimalPlaces(this decimal dNum) 
    { 
     return ((decimal)(Math.Truncate((double)dNum*100.0)/100.0)); 
    } 
} 
15

Se sono arrotondamento giù allora avete bisogno:

Math.Floor(number * 100)/100; 

se siete alla ricerca di qualcosa di chiamato "bankers rounding" (probabilmente non se è per l'output e non per le statistiche/somma) quindi:

Math.Round(number, 2); 

Infine, se si vuole, non so cosa il termine corretto è, 'arrotondamento normale':

Math.Round(number, 2, MidpointRounding.AwayFromZero); 
+0

Guarda la mia risposta di seguito: MidpointRounding.AwayFromZero o MidpointRounding.ToEven specifica come per gestire i numeri che terminano con "5": MidpointRounding.ToEven specifica che 1.135 deve essere rotondo a 1.13 e 1.145 a 1.15 il MidpointRounding.AwayFromZero specifica che 1.135 dovrebbe essere rotondo a 1.14 e 1.145 a 1.15 –

5

Usa Math.Floor se si vuole arrotondare tha valore, oppure Math.Round se si vuole ottenere un giro esatto. Math.Truncate rimuovere semplicemente la parte decimale del numero, in modo da ottenere risultati negativi per i numeri negativi:

var result= Math.Floor(number * 100)/100; 

Math.floor tornare sempre il più piccolo valore integrale che è minore (Piano) o superiore (soffitto) rispetto al valore specificato. Quindi non ottieni un arrotondamento corretto. Esempio:

Math.Floor(1.127 * 100)/100 == 1.12 //should be 1.13 for an exact round 
Math.Ceiling(1.121 * 100)/100 == 1.13 //should be 1.12 for an exact round 

Preferire sempre la versione di Math.Round che contiene il parametro di arrotondamento del punto medio. Questo parametro specifica come gestire i valori intermedi (5) come ultima cifra.

Se non si specifica AwayFromZero come valore per param, si otterrà il comportamento predefinito, ovvero ToEven. Ad esempio, utilizzando Toeven come metodo di arrotondamento, si ottiene:

Math.Round(2.025,2)==2.02 
Math.Round(2.035,2)==2.04 

invece, utilizzando MidPoint.AwayFromZero param:

Math.Round(2.025,2,MidpointRounding.AwayFromZero)==2.03 
Math.Round(2.035,2,MidpointRounding.AwayFromZero)==2.04 

Così, per un arrotondamento normale, è meglio usare questo codice:

var value=2.346; 
var result = Math.Round(value, 2, MidpointRounding.AwayFromZero); 
+0

hai letto la domanda Ho detto "round down" –

+0

Siamo spiacenti, le mie scuse ... –