如何设置变量来分割和舍入到0位小数?

时间:2011-05-10 01:03:03

标签: ruby

在Ruby中,我该怎么做:

number_total = records / per_page

其中per_page = 100records = 1050,然后向上舍入,所以没有小数?那么,而不是10.5,它等于11?

4 个答案:

答案 0 :(得分:28)

在评论后编辑

number_total = (records / per_page.to_f).ceil

答案 1 :(得分:1)

@lulala邪恶的另一个根源:挑选樱桃。

多次运行您的基准测试。 我得到以下内容:

V1     V2  V3  V4  V5  V6
Chevy  V8  4D  AT  PS  NAV

这是一个平局。

       user     system      total        real
   0.120000   0.000000   0.120000 (  0.119281)
   0.120000   0.000000   0.120000 (  0.123431)

这表明 user system total real 0.110000 0.000000 0.110000 ( 0.118602) 0.130000 0.000000 0.130000 ( 0.127195) 更快。

float_op

这表明 user system total real 0.150000 0.000000 0.150000 ( 0.151104) 0.120000 0.000000 0.120000 ( 0.123836) 我们更快。

答案 2 :(得分:0)

这是万恶之源:一种过早优化的方法:

class Integer
  # returns quotient's ceiling integer
  def div_ceil(divisor)
    q = self / divisor
    if self % divisor > 0
      return q + 1
    else
      return q
    end
  end
end

以下基准代码:

require 'benchmark'

$a = 1050
$b = 100

def float_op
  ( $a / $b.to_f ).ceil
end

def integer_op
  q = $a / $b
  if $a % $b > 0
    return q + 1
  else
    return q
  end
end

n = 1000000
Benchmark.bm do |x|
  x.report { n.times do; float_op; end }
  x.report { n.times do; integer_op; end }
end

给我这个结果

       user     system      total        real
   0.160000   0.000000   0.160000 (  0.157589)
   0.130000   0.000000   0.130000 (  0.133821)

答案 3 :(得分:0)

如果您不希望使用浮点转换,请对其余项目使用%(模数)(这是我们在逻辑上思考时实际上确定#个页面的方式)。

number_total = (records / per_page) + ((records % per_page).positive? ? 1 : 0)

# (records / per_page) gets all full pages
# (records % per_page) get remainder of records after integer div
# + 1 only if remainder is positive