to_r()
public
Returns the value as a rational.
NOTE: 0.3.to_r isn’t the same as
‘0.3’.to_r. The latter is equivalent to
‘3/10’.to_r, but the former isn’t so.
2.0.to_r
2.5.to_r
-0.75.to_r
0.0.to_r
See rationalize.
static VALUE
float_to_r(VALUE self)
{
VALUE f, n;
float_decode_internal(self, &f, &n);
#if FLT_RADIX == 2
{
long ln = FIX2LONG(n);
if (ln == 0)
return rb_rational_new1(f);
if (ln > 0)
return rb_rational_new1(rb_int_lshift(f, n));
ln = -ln;
return rb_rational_new2(f, rb_int_lshift(ONE, INT2FIX(ln)));
}
#else
f = rb_int_mul(f, rb_int_pow(INT2FIX(FLT_RADIX), n));
if (RB_TYPE_P(f, T_RATIONAL))
return f;
return rb_rational_new1(f);
#endif
}