如何将浮点形式的时间(hh.mm)除以红宝石中的整数?

时间:2019-07-11 11:55:57

标签: ruby-on-rails ruby

我正在尝试将浮点形式(hh.mm)的时间除以整数。 例如,1.30 x 2必须为00.45。 有没有简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:6)

使用浮点数表示h.mm有点不寻常。通常,您将使用字符串进行格式化。

但是,我将从浮点值中提取小时和分钟开始。为此,我将使用format将浮点数转换为字符串:

time = 1.3
time_str = format('%.2f', time)
#=> "1.30"

然后我将split处的字符串.取得小时部分和分钟部分,然后调用to_i将它们转换为实际的整数:(我正在使用{{3} },您也可以稍后致电h = h.to_i / m = m.to_i

h, m = time_str.split('.').map(&:to_i)
h #=> 1
m #=> 30

现在我们将数字130设为整数,我们可以轻松地以分钟为单位计算总持续时间:

duration = h * 60 + m
#=> 90

然后我将持续时间除以2(或任何值):

duration /= 2
#=> 45

并使用map将其转换回小时和分钟:(一次返回两个值)

h, m = duration.divmod(60)
h #=> 0
m #=> 45

我们可以将它们格式化为字符串:

format('%02d.%02d', h, m)
#=> "00.45"

或将其转换回浮点数:

time = h + m.fdiv(100)
#=> 0.45

可以这样设置:

format('%05.2f', time)
#=> "00.45"

答案 1 :(得分:2)

time    = 1.3
divisor = 2

hr, min = (time.fdiv(divisor)).divmod(1)
  #=> [0, 0.65]
min = (60 * min).round
  #=> 39 
"%02d.%02d" % [hr, min]
  #=> "00.39"

另一个例子。

time    = 1005
divisor =    5

hr, min = (time.fdiv(divisor)).divmod(1)
  #=> [201, 0.0] 
"%02d.%02d" % [hr, (60 * min).round]
  #=> "201.00" 

请参见Integer#fdivFloat#fdivInteger#divmodInteger#rounddivmod是一种非常有用的方法,由于我不明白的原因,它似乎未得到充分利用。

答案 2 :(得分:0)

也许您可以将其拆分为一个数组,然后:

n = 2
[1, 30].then { |h, m| [h / n, (m + h % n * 60) / n]}
#=> [0, 45]

用于拆分:

num = 1.3
('%.2f' % num).split('.').map(&:to_i) #=> [1, 30]

答案 3 :(得分:0)

您可以尝试以下操作:

num = 1.3

splitted_values = ('%.2f' % num).split('.').map(&:to_i) => [1, 30]

((splitted_values[0] * 60) / 2) + (splitted_values[1] / 2 ) => 45