End of Life Ruby 3.0 has reached end of life and gets no more fixes. Switch to Ruby 4.0 →
instance method
Rational#rationalize
rat.rationalize → self
rat.rationalize(eps) → rational
rational.c
View on GitHub ↗
static VALUE
nurat_rationalize(int argc, VALUE *argv, VALUE self)
{
VALUE e, a, b, p, q;
VALUE rat = self;
get_dat1(self);
if (rb_check_arity(argc, 0, 1) == 0)
return self;
e = f_abs(argv[0]);
if (INT_NEGATIVE_P(dat->num)) {
rat = f_rational_new2(RBASIC_CLASS(self), rb_int_uminus(dat->num), dat->den);
}
a = FIXNUM_ZERO_P(e) ? rat : rb_rational_minus(rat, e);
b = FIXNUM_ZERO_P(e) ? rat : rb_rational_plus(rat, e);
if (f_eqeq_p(a, b))
return self;
nurat_rationalize_internal(a, b, &p, &q);
if (rat != self) {
RATIONAL_SET_NUM(rat, rb_int_uminus(p));
RATIONAL_SET_DEN(rat, q);
return rat;
}
return f_rational_new2(CLASS_OF(self), p, q);
}
Returns a simpler approximation of the value if the optional argument eps is given (rat-|eps| <= result <= rat+|eps|), self otherwise.
Example
r = Rational(5033165, 16777216) r.rationalize #=> (5033165/16777216) r.rationalize(Rational('0.01')) #=> (3/10) r.rationalize(Rational('0.1')) #=> (1/3)