2013-03-01 15 views
25

Sto cercando di capire come arrotondare i prezzi, in entrambi i modi. Per esempio:Arrotondare gli interi al multiplo più vicino di 10

Round down 
43 becomes 40 
143 becomes 140 
1433 becomes 1430 

Round up 
43 becomes 50 
143 becomes 150 
1433 becomes 1440 

ho la situazione in cui ho una fascia di prezzo di dire:

£143 - £193 

di cui voglio mostrare come:

£140 - £200 

come sembra molto pulitore

Qualche idea su come posso raggiungere questo obiettivo?

+0

Ho provato Math.floor – dhardy

+0

pavimento è piano è per i doppi. – evanmcdonnal

+0

dividere per 10, arrotondare, moltiplicare per 10 –

risposta

48

Vorrei solo creare un paio di metodi;

int RoundUp(int toRound) 
{ 
    if (toRound % 10 == 0) return toRound; 
    return (10 - toRound % 10) + toRound; 
} 

int RoundDown(int toRound) 
{ 
    return toRound - toRound % 10; 
} 

Modulus ci dà il resto, nel caso di arrotondamento 10 - r vi porta al più vicino decimo, per arrotondare basta sottrarre r. Abbastanza diretto.

+10

Il 'RoundUp' è rotto. Se passi '20', viene arrotondato a' 30', che molto probabilmente non è quello che vuoi. È possibile eseguire un test condizionale ('if ((toRound% 10) == 0) return toRound;') o utilizzare un arrotondamento incondizionato, ad esempio 'return ((toRound + 9)/10) * 10;' – DarkDust

+3

Nota che la logica sopra funziona solo per numeri positivi (come ho appena scoperto). – Knightsy

+2

Passare a 'Math.Abs ​​(toRound)% 10' se si dispone di negativi ovunque nel calcolo del prezzo o in altro modo. – Knightsy

4

Dividere il numero per 10.

number = number/10; 
Math.Ceiling(number);//round up 
Math.Round(number);//round down 

Poi moltiplicare per 10.

number = number * 10; 
+0

Fornisce la risposta errata per 1433 in base alla specifica –

10

Questo codice arrotonda al più vicino multiplo di 10:

int RoundNum(int num) 
{ 
    int rem = num % 10; 
    return rem >= 5 ? (num - rem + 10) : (num - rem); 
} 

Molto semplice utilizzo:

Console.WriteLine(RoundNum(143)); // prints 140 
Console.WriteLine(RoundNum(193)); // prints 190 
+0

Fornisce la risposta errata per 1433 in base alle specifiche. –

12

Non è necessario utilizzare il modulo (%) o in virgola mobile ...

Questo funziona:

public static int RoundUp(int value) 
{ 
    return 10*((value + 9)/10); 
} 

public static int RoundDown(int value) 
{ 
    return 10*(value/10); 
} 
+0

Potrebbe non darti quello che vuoi per numeri molto grandi (ad esempio Int32.MaxValue) – Joe

+1

Sì, RoundUp non riuscirà per i numeri superiori a (int32.MaxValue-10). Non pensate che sia un problema per i prezzi in sterline però. E non è possibile arrotondare quei numeri in ogni caso, con qualsiasi mezzo (a meno che non si ritorni a lungo). –

+1

Questo ha funzionato bene per me, e mi piace che non usi modulo. Equivalente a Go: func RoundUp (v int) int { \t ritorno 10 * ((v + 9)/10) } func RoundDown (v int) int { \t ritorno 10 * (v/10) } – fiorix

2

Un metodo generale per arrotondare un numero a un multiplo di un altro numero, arrotondando away from zero.

Per intero

int RoundNum(int num, int step) 
{ 
    if (num >= 0) 
     return ((num + (step/2))/step) * step; 
    else 
     return ((num - (step/2))/step) * step; 
} 

Per galleggiante

float RoundNum(float num, float step) 
{ 
    if (num >= 0) 
     return floor((num + step/2)/step) * step; 
    else 
     return ceil((num - step/2)/step) * step; 
} 

so alcune parti potrebbero sembrare intuitivo o non molto ottimizzato. Ho provato il cast (num + step/2) su un int, ma questo ha dato risultati errati per i float negativi ((int) -12.0000 = -11 e così via). Comunque questi sono alcuni casi ho provato:

  • qualsiasi numero arrotondato al passaggio 1 dovrebbe essere sé
  • -3 arrotondato al passaggio 2 = -4
  • -2 arrotondato al passaggio 2 = -2
  • 3 arrotondato al passaggio 2 = 4
  • 2 arrotondato al passaggio 2 = 2
  • -2.3 arrotondato al passo 0,2 = -2.4
  • -2.4 arrotondato al passaggio 0,2 = -2,4
  • 2,3 arrotondato al passaggio 0,2 = 2,4
  • 2,4 arrotondato al passaggio 0,2 = 2,4
Problemi correlati