как конвертировать дробь в плавающую в ruby - PullRequest
9 голосов
/ 14 февраля 2010

У меня есть строка "1/16" Я хочу преобразовать ее в число с плавающей точкой и умножить на 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

Ответы [ 3 ]

17 голосов
/ 14 февраля 2010

Использование Rational

>> (Rational(*("1/16".split('/').map( &:to_i )))*45).to_f
=> 2.8125
10 голосов
/ 26 декабря 2012

@ Фаррел был прав, и поскольку 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)
10 голосов
/ 14 февраля 2010

Похоже, вам придется разбирать дробь самостоятельно. Это будет работать с дробными и целыми числами, но не со смешанными числами (то есть: 1½ не будет работать).

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

"1/16".to_frac * 45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...