2009-05-17 21 views
5

Tôi muốn làm tròn số lên đến thứ tự độ lớn gần nhất. (Tôi nghĩ rằng tôi đã nói đúng này)Làm cách nào để làm tròn số lên đến độ chính xác động trong Ruby On Rails?

Dưới đây là một số ví dụ:

Input => Output 

8 => 10 
34 => 40 
99 => 100 
120 => 200 
360 => 400 
990 => 1000 
1040 => 2000 
1620 => 2000 
5070 => 6000 
9000 => 10000 

Bất cứ ai biết một cách nhanh chóng để viết rằng trong Ruby hay Rails?

Về cơ bản, tôi cần biết thứ tự độ lớn của số và cách làm tròn độ chính xác đó.

Cảm ơn!

Trả lời

13

Dưới đây là một cách khác:

def roundup(num) 
    x = Math.log10(num).floor 
    num=(num/(10.0**x)).ceil*10**x 
    return num 
end 

idiomatically thêm:

def roundup(num) 
    x = Math.log10(num).floor 
    (num/(10.0**x)).ceil * 10**x 
end 
+2

bạn không cần báo cáo trả lại. Ruby trả về giá trị của câu lệnh cuối cùng trong một phương thức theo mặc định. Giải pháp tốt đẹp mặc dù. +1 – Demi

+1

Để khớp với thông số ban đầu nơi 8 => 10, hãy thay đổi dòng đầu tiên thành 'x = [Math.log10 (num) .floor, 1] .max' –

+0

Hãy cẩn thận kiểm tra xem num đó có phải là 0 hay âm hay không vì thì logarit sẽ không được xác định. – wyclin

0

Đây là giải pháp. Nó thực hiện các quy tắc sau:

  • 0 và quyền hạn của 10 không được sửa đổi;
  • 9 ??? được làm tròn lên đến 10000 (bất kể là bao lâu);
  • A ??? được làm tròn lên đến B000 (bất kể là bao lâu), trong đó B là chữ số sau A.

.

def roundup(n) 
    n = n.to_i 
    s = n.to_s 
    s =~ /\A1?0*\z/ ? n : s =~ /\A\d0*\z/ ? ("1" + "0" * s.size).to_i :  
     (s[0, 1].to_i + 1).to_s + "0" * (s.size - 1)).to_i 
end 

fail if roundup(0) != 0 
fail if roundup(1) != 1 
fail if roundup(8) != 10 
fail if roundup(34) != 40 
fail if roundup(99) != 100 
fail if roundup(100) != 100 
fail if roundup(120) != 200 
fail if roundup(360) != 400 
fail if roundup(990) != 1000 
fail if roundup(1040) != 2000 
fail if roundup(1620) != 2000 
fail if roundup(5070) != 6000 
fail if roundup(6000) != 10000 
fail if roundup(9000) != 10000 
+0

Bạn đang thiếu một dấu ngoặc. (Và hãy để đây là một bài học cho bạn, trẻ em: Đừng lạm dụng các toán tử ternary!) – Chuck

+0

Ngoài ra, roundup (100) = 100 và roundup (6000) = 10000 không tuân theo quy tắc "A ??? được làm tròn lên đến (A + 1) 000 ". Nó phải là 200 và 7000 theo các quy tắc, mặc dù tôi nghĩ rằng hành vi roundup (100) = 100 có thể gần với chức năng mà người hỏi đã dự định. – Chuck

+0

Bạn đúng Chuck. Ngoài ra, trong khi roundup (100) = 100 là không chính xác theo thông số kỹ thuật của tôi, điều đó sẽ rất tuyệt. Tôi đã tốt với roundup (100) = 100 hoặc roundup (100) = 200 vì vậy tôi chỉ cần chọn một. – Tony

Các vấn đề liên quan