Хотя это не совсем ответ на ваш вопрос, я думаю, что мы должны упомянуть здесь Rational класс, подходящий для хранения рациональных чисел без потерь, подразумеваемых с хранением чисел с плавающей точкой, т.е. в виде дробей
n = 3
#=> 3
r = Rational(1,3)
#=> 13 # don't let this confuse you, this is 1/3 in fact
r.to_s
#=> "1/3"
Вы можете выполнять обычную рациональную арифметику для таких чисел, сохраняя точность дробей:
r = r * r
#=> 19
r.to_s
#=> "1/9"
И, в конце концов, вы можете преобразовать эти числа в обычные числа с плавающей запятой:
r.to_f
#=> 0.111111111111111