如何将一个分数转换为在ruby中浮动

时间:2010-02-13 23:54:09

标签: ruby

我有一个字符串"1/16"我想将其转换为float并将其乘以45。但是,我没有得到预期的结果。

我正在尝试script/console

>> "1/16".to_f
=> 1.0
>> "1/16".to_f*45
=> 45.0

如何获得2.81

的预期结果

更大的图片: 我有这样的下拉:

<%=select_tag :volume, options_for_select(["", "1 g", "1/16 oz", "1/8 oz","1/4 oz",
"1/2 oz", "1 oz", "1/8 lb", "1/4 lb", "Single", "Multi 5" ], "N/A") %>

每当用户选择oz值时,我想将其乘以45

所以我这样做:

first, *rest = params[:volume].to_s.split(/ /)
if rest.first=="oz"
    @indprodprice = @prods.orig_price.to_i*first.to_f*28.3495
else 
    @indprodprice = @prods.orig_price.to_i*first.to_f*453.59237
end

4 个答案:

答案 0 :(得分:17)

使用Rational

>> (Rational(*("1/16".split('/').map( &:to_i )))*45).to_f
=> 2.8125

答案 1 :(得分:10)

看起来你将不得不自己解析这个分数。这将适用于分数和整数,但不适用于混合数字(即:1½不起作用。)

class String
  def to_frac
    numerator, denominator = split('/').map(&:to_f)
    denominator ||= 1
    numerator/denominator
  end
end

"1/16".to_frac * 45

答案 2 :(得分:10)

@Farrel是对的,因为Ruby 1.9包含Rational而String有一个to_r - 方法更容易:

puts ("1/16".to_r * 45).to_f  #=> 2.8125
puts ("1/16".to_r * 45).to_f.round(2) #=> 2.81

在2.0中,理性文字变得更加容易:

1/16r # => (1/16)

答案 3 :(得分:0)

这是我能想到的最容易理解的答案


def toFloat(fract)

   str = fract.to_s
   parts = str.split("/")

   numerator = parts[0].to_f
   denominator = parts[1].to_f

   return numerator / denominator

end

puts toFloat(3/4r) # 0.75

puts toFloat(2/3r) # 0.666666666666...