我正在尝试将浮点形式(hh.mm)的时间除以整数。 例如,1.30 x 2必须为00.45。 有没有简单的方法可以做到这一点?
答案 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
现在我们将数字1
和30
设为整数,我们可以轻松地以分钟为单位计算总持续时间:
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#fdiv,Float#fdiv,Integer#divmod和Integer#round。 divmod
是一种非常有用的方法,由于我不明白的原因,它似乎未得到充分利用。
答案 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