diff --git a/spec/core/rational/floor_spec.rb b/spec/core/rational/floor_spec.rb index 5468111f9b..5108e363f7 100644 --- a/spec/core/rational/floor_spec.rb +++ b/spec/core/rational/floor_spec.rb @@ -40,12 +40,10 @@ @rational.floor(2).should eql Rational(7857, 25) @rational.floor(3).should eql Rational(62857, 200) - NATFIXME 'it should return Rational instead of Integer', exception: SpecFailedException do - Rational(100, 2).floor(1).should eql Rational(50, 1) - Rational(100, 2).floor(2).should eql Rational(50, 1) - Rational(-100, 2).floor(1).should eql Rational(-50, 1) - Rational(-100, 2).floor(2).should eql Rational(-50, 1) - end + Rational(100, 2).floor(1).should eql Rational(50, 1) + Rational(100, 2).floor(2).should eql Rational(50, 1) + Rational(-100, 2).floor(1).should eql Rational(-50, 1) + Rational(-100, 2).floor(2).should eql Rational(-50, 1) end end end diff --git a/src/rational_object.cpp b/src/rational_object.cpp index 3ff99879f4..e0230a49ed 100644 --- a/src/rational_object.cpp +++ b/src/rational_object.cpp @@ -134,8 +134,6 @@ bool RationalObject::eq(Env *env, Value other) { } Value RationalObject::floor(Env *env, Optional precision_arg) { - if (m_denominator == 1) - return IntegerMethods::floor(env, m_numerator, precision_arg); nat_int_t precision = 0; if (precision_arg) @@ -149,6 +147,9 @@ Value RationalObject::floor(Env *env, Optional precision_arg) { if (precision == 0) return to_f(env).as_float()->floor(env, precision_arg); + if (m_denominator == 1) + return create(IntegerMethods::floor(env, m_numerator, precision_arg), Value::integer(1)); + auto powered = Natalie::pow(10, precision); auto numerator = mul(env, powered).as_rational()->floor(env).integer();