2009-05-17 47 views
5

我想將數字整數到最接近的數量級。 (我覺得我說的這個權利)如何在Ruby On Rails中將動態精度的數字進行舍入?

下面是一些例子:

Input => Output 

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

任何人都知道一個快速的方法寫在Ruby或Rails的?

本質上我需要知道數字的數量級以及如何以該精度進行舍入。

謝謝!

回答

13

這裏的另一種方式:

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

更地道:

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

這是一個解決方案。它實現了以下規則:

  • 0和10的冪沒有修改;
  • 9 ???四捨五入到10000(不管多長時間);
  • A ???被舍入到B000(無論多長時間),其中B是接下來的數字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

你缺少一個括號。 (並且讓這成爲你的一個教訓,孩子們:不要濫用三元操作符!) – Chuck 2009-05-18 00:38:25

+0

另外,綜合(100)= 100和綜合(6000)= 10000不遵循「A ???四捨五入的規則到(A + 1)000「。根據規則,它應該是200和7000,但我認爲綜合(100)= 100行爲可能更接近提問者所期望的功能。 – Chuck 2009-05-18 00:46:44