2013-03-01 34 views
25

Tôi đang cố gắng tìm ra cách làm tròn giá - cả hai cách. Ví dụ:Làm tròn số nguyên đến bội số gần nhất của 10

Round down 
43 becomes 40 
143 becomes 140 
1433 becomes 1430 

Round up 
43 becomes 50 
143 becomes 150 
1433 becomes 1440 

Tôi có tình huống mà tôi có một phạm vi giá của nói:

£143 - £193 

của mà tôi muốn thể hiện như:

£140 - £200 

vì nó trông rất cleaner

Bất kỳ ý tưởng nào về cách tôi có thể đạt được điều này?

+0

Tôi đã thử Math.floor – dhardy

+0

Floor là sàn được cho đôi. – evanmcdonnal

+0

chia cho 10, tròn, nhân với 10 –

Trả lời

48

Tôi sẽ chỉ tạo một vài phương thức;

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

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

Modulus cho chúng ta thời gian còn lại, trong trường hợp làm tròn lên 10 - r sẽ đưa bạn đến mười gần nhất, để làm tròn xuống, bạn chỉ trừ r. Khá thẳng về phía trước.

+10

'RoundUp' bị hỏng. Nếu bạn vượt qua '20', nó sẽ được làm tròn thành' 30', rất có thể không phải là thứ bạn muốn. Bạn có thể thực hiện kiểm tra có điều kiện ('if ((toRound% 10) == 0) trả về toRound;') hoặc sử dụng làm tròn vô điều kiện, ví dụ 'return ((toRound + 9)/10) * 10;' – DarkDust

+3

rằng logic ở trên chỉ hoạt động với các số dương (như tôi vừa phát hiện ra). – Knightsy

+2

Thay đổi thành 'Math.Abs ​​(toRound)% 10' nếu bạn có bất kỳ giá trị âm nào ở bất kỳ giá nào hoặc bằng cách khác. – Knightsy

4

Divide số bằng 10.

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

Sau đó nhân với 10.

number = number * 10; 
+0

Đưa ra câu trả lời sai cho 1433 theo thông số –

10

Mã này viên đạn đến bội số gần nhất của 10:

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

sử dụng Rất đơn giản:

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

Đưa ra câu trả lời sai cho 1433 theo thông số kỹ thuật. –

12

Bạn không cần phải sử dụng mô đun (%) hoặc dấu chấm động ...

này hoạt động:

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

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

Có thể không cung cấp cho bạn những gì bạn muốn cho số lượng rất lớn (ví dụ: Int32.MaxValue) – Joe

+1

Có, RoundUp sẽ thất bại đối với số lớn hơn (int32.MaxValue-10). Đừng nghĩ rằng đó là một vấn đề đối với giá cả trong bảng dù. Và không thể làm tròn những con số đó bằng bất kỳ cách nào (trừ khi bạn trả lại một thời gian dài). –

+1

Điều này làm việc tốt cho tôi, và tôi thích rằng nó không sử dụng modulus. Tương đương tại Gò: func ROUNDUP (v int) int { \t trở lại 10 * ((v + 9)/10) } func ROUNDDOWN (v int) int { \t trở lại 10 * (v/10) } – fiorix

2

Một phương pháp chung để làm tròn một số đến bội số của một số khác, làm tròn away from zero.

Đối với số nguyên

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

Đối với phao

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

Tôi biết một số bộ phận có vẻ phản trực giác hay không rất tối ưu. Tôi đã cố gắng đúc (num + bước/2) đến một int, nhưng điều này đã cho kết quả sai cho phao âm ((int) -12.0000 = -11 và như vậy). Dù sao đây là một vài trường hợp tôi thử nghiệm:

  • bất kỳ số tròn lại bước 1 nên tự
  • -3 làm tròn đến bước 2 = -4
  • -2 tròn lại bước 2 = -2
  • 3 được làm tròn thành bước 2 = 4
  • 2 làm tròn thành bước 2 = 2
  • -2.3 làm tròn thành bước 0,2 = -2.4
  • -2,4 làm tròn đến bước 0,2 = -2,4
  • 2,3 làm tròn đến bước 0,2 = 2,4
  • 2,4 làm tròn đến bước 0,2 = 2,4