2013-07-21 3 views
0

У меня есть два небольших числа, которые я хотел бы найти процент.Найти процент двух небольших чисел в рубине

First number: 0.683789473684211 
Second number: 0.678958333333333 

Я хочу узнать, какой процент от числа больше или меньше. Это небольшие числа, но они могут быть больше. Первое число МОЖЕТ быть 250, а второе число может быть 0,3443435. То, что я пытаюсь сделать, это определить, будет ли первое число на 25% больше второго.

Я попытался с помощью этого:

class Numeric 
    def percent_of(n) 
    self.to_f/n.to_f * 100.0 
    end 
end 

Но твердил я делил на ноль

Как бы вы это сделать?

+0

В псевдокоде: будет ли 'if a> (b * 1.25), то // что-то делать, что вам нужно? –

ответ

0

Основная реализация вашего кода выглядит правильно для меня. Можете ли вы предоставить конкретный пример и ожидаемый результат, который создает эту ошибку?

Только потому, что мне было любопытно, я взял ваш код и выполнил его с небольшим набором тестов и провел 3 проходящих теста.

require 'rubygems' 
require 'test/unit' 

class Numeric 
    def percent_of(n) 
    self.to_f/n.to_f * 100.00 
    end 
end 

class PercentageTeset < Test::Unit::TestCase 
    def test_25_is_50_percent_of_50 
    assert_equal (25.percent_of(50)), 50.0 
    end 
    def test_50_is_100_percent_of_50 
    assert_equal (50.percent_of(50)), 100.0 
    end 
    def test_75_is_150_percent_of_50 
    assert_equal (75.percent_of(50)), 150.0 
    end 
end 
0
class Numeric 
    def percent_of(n) 
    self.to_f/n.to_f * 100.0 
    end 
end 

p 0.683789473684211.percent_of(0.678958333333333) 

--output:-- 
100.71155181602376 

p 250.percent_of(0.3443435) 

--output:-- 
72601.9222084924 

p 0.000_001.percent_of(0.000_000_5) 

--output:-- 
200.0 

p 0.000_000_000_01.percent_of(0.000_000_000_01) 

--output:-- 
100.0 
0
class Numeric 
    def percent_of(n) 
    self.to_f/n.to_f * 100.0 
    end 
end 

numbers = [ 0.683789473684211, 0.678958333333333 ] 
min_max = {min: numbers.min, max: numbers.max} 

puts "%<min>f is #{min_max[:min].percent_of(min_max[:max])} of %<max>f" % min_max 

Эта программа имеет мнение, что показывает, какой процент минимальное число максимального числа, и показывает число.

Если вы используете %d для метода String#format, вы увидите, 0. Возможно, именно об этом вы говорили, не уверен.

Редактировать: Использование minmax, как предложено.

class Numeric 
    def percent_of(n) 
    self.to_f/n.to_f * 100.0 
    end 
end 

numbers = [ 0.683789473684211, 0.678958333333333 ] 
min_max = Hash.new 
min_max[:min], min_max[:max] = numbers.minmax 

puts "%<min>f is #{min_max[:min].percent_of(min_max[:max])} of %<max>f" % min_max 

Мне нравится первый вариант, как хэш построен, как это необходимо, а не initalized, а затем построили.

+0

[minmax] (http://ruby-doc.org/core-2.0/Enumerable.html#method-i-minmax) - это существующий метод в Enumerable. – steenslag

1

Почему бы не стрелять прямо из-за того, что вы говорите, что хотите сделать?

class Numeric 
    def sufficiently_bigger?(n, proportion = 1.25) 
    self >= proportion * n 
    end 
end 

p 5.sufficiently_bigger? 4   # => true 
p 5.sufficiently_bigger? 4.00001 # => false 

Это будет по умолчанию на 25% больший чек, но вы можете переопределить пропорциональность путем подачи другого значения в качестве второго аргумента.

Как правило, это проще и позволяет избежать явной проверки нулевого знамена, если вы выражаете отношения в форме продукта, а не используете деление.

Смежные вопросы