Как округлить числа до динамической точности в Ruby On Rails? - PullRequest
5 голосов
/ 18 мая 2009

Я хочу округлить числа до ближайшего порядка. (Я думаю, что я сказал это правильно)

Вот несколько примеров:

Input => Output

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

Кто-нибудь знает быстрый способ написать это на Ruby или Rails?

По сути, мне нужно знать порядок величины числа и как округлить с этой точностью.

Спасибо!

Ответы [ 2 ]

14 голосов
/ 18 мая 2009

Вот еще один способ:

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 голосов
/ 18 мая 2009

Вот решение. Он реализует следующие правила:

  • 0 и степени 10 не изменены;
  • 9 ??? округляется до 10000 (независимо от того, как долго);
  • А ??? округляется до 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
...