2013-03-01 20 views
25

Próbuję dowiedzieć się, jak zaokrąglić ceny - w obie strony. Na przykład:Zaokrąglanie liczb całkowitych do najbliższej wielokrotności 10

Round down 
43 becomes 40 
143 becomes 140 
1433 becomes 1430 

Round up 
43 becomes 50 
143 becomes 150 
1433 becomes 1440 

Mam sytuacji gdzie mam zakres cen słownie:

£143 - £193 

które chcę pokazać jak:

£140 - £200 

jak to wygląda dużo cleaner

Jakieś pomysły na to, jak mogę to osiągnąć?

+0

Próbowałem math.floor – dhardy

+0

powierzchni jest podłoga dla podwójnych. – evanmcdonnal

+0

podzielić przez 10, okrągłe, pomnożyć przez 10 –

Odpowiedz

48

Po prostu utworzę kilka metod;

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

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

Moduł daje nam resztę, w przypadku zaokrąglania 10 - r zabierze Cię do najbliższej dziesiątej, zaokrąglić w dół po prostu odejmować r. Całkiem prosto.

+10

"RoundUp" jest zepsuty. Jeśli zdasz "20", zostanie on zaokrąglony do "30", co najprawdopodobniej nie jest tym, czego potrzebujesz. Możesz wykonać test warunkowy ('if ((toRound% 10) == 0) return toRound;') lub użyj bezwarunkowego zaokrąglenia, na przykład 'return ((toRound + 9)/10) * 10;' – DarkDust

+3

Uwaga że powyższa logika działa tylko dla liczb dodatnich (jak się właśnie dowiedziałem). – Knightsy

+2

Przejdź do 'Math.Abs ​​(toRound)% 10', jeśli masz negatywy w dowolnym miejscu w kalkulacji ceny lub w inny sposób. – Knightsy

4

podzielić liczbę przez 10.

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

następnie pomnożyć przez 10.

number = number * 10; 
+0

Podaje błędną odpowiedź dla 1433 zgodnie ze specyfikacją –

10

Ten kod zaokrągla do najbliższej wielokrotności 10:

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

bardzo proste użycia:

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

Podaje błędną odpowiedź dla 1433 zgodnie ze specyfikacją. –

12

Nie trzeba używać moduł (%) lub zmiennoprzecinkowych ...

to działa:

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

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

Może nie dać ci tego, czego potrzebujesz dla bardzo dużych liczb (np. Int32.MaxValue) – Joe

+1

Tak, RoundUp nie powiedzie się dla liczb wyższych niż (int32.MaxValue-10). Nie myśl, że to kwestia cen w funtach. A i tak nie da się ich zaokrąglić w żaden sposób (chyba że zwrócisz długi). –

+1

To działało dobrze dla mnie i lubię, że nie używa modułu. Równoważne w ruchu: func ROUNDUP (v int) int { \t zwrotny 10 * ((V + 9)/10) } func ROUNDDOWN (v int) int { \t zwrotny 10 * (v/10) } – fiorix

2

ogólną metodę zaokrąglić liczbę do wielokrotności inny numer, zaokrąglenia away from zero.

Dla całkowitej

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

Dla pływaka

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

Znam niektóre części może się wydawać sprzeczne z intuicją, czy nie bardzo zoptymalizowany. Próbowałem rzutowania (liczba + krok/2) na int, ale dało to błędne wyniki dla ujemnych pływaków ((int) -12.0000 = -11 i takie). W każdym razie te kilka przypadków testowanego:

  • dowolną liczbę w zaokrągleniu do 1 powinna być sama
  • -3 zaokrąglone do kroku 2 = -4
  • -2 zaokrąglone do kroku 2 = -2
  • 3 zaokrąglone do kroku 2 = 4
  • 2 zaokrąglone do kroku 2 = 2
  • -2,3 zaokrąglone do stopnia 0,2 = -2.4
  • -2,4 zaokrąglone do kroku 0,2 = -2,4
  • 2,3 zaokrąglone do kroku 0,2 = 2,4
  • 2,4 zaokrąglone do kroku 0,2 = 2,4
Powiązane problemy