From: "marcandre (Marc-Andre Lafortune)" Date: 2013-09-11T13:24:34+09:00 Subject: [ruby-core:57127] [ruby-trunk - Bug #8894] Fixnum#quo returns wrong result when given a float Issue #8894 has been updated by marcandre (Marc-Andre Lafortune). Issue is actually with Rational#/ that apparently makes a special case of float values that are "multiples" of the denominator, so that: Rational(6) / 2.0 # => Rational(6, 2) Putting aside the bug that the Rational returned is not reduced, I feel it is the wrong to return a Rational for many reasons. 1) A float is imprecise; other than very special cases one should not obtain exact values whenever one is involved in the calculation. 2) Inconsistent with Rational(5) / BigDecimal(2) that returns (correctly) a BigDecimal) 3) Inconsistent with Rational(6) / 1.5, that returns which won't return 4 nor Rational(4) Is there any reason we should keep that special case? diff --git a/rational.c b/rational.c index 652f5ac..f8284d9 100644 --- a/rational.c +++ b/rational.c @@ -959,9 +959,6 @@ nurat_div(VALUE self, VALUE other) if (isnan(x)) return DBL2NUM(NAN); if (isinf(x)) return INT2FIX(0); - if (x != 0.0 && modf(x, &den) == 0.0) { - return rb_rational_raw2(dat->num, f_mul(rb_dbl2big(den), dat->de - } } return rb_funcall(f_to_f(self), '/', 1, other); } ---------------------------------------- Bug #8894: Fixnum#quo returns wrong result when given a float https://bugs.ruby-lang.org/issues/8894#change-41733 Author: marcandre (Marc-Andre Lafortune) Status: Open Priority: Normal Assignee: Category: core Target version: ruby -v: p195 Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN Fixnum#quo is buggy. 2.quo(2.0) # => Rational(2, 2) 1) Should return a float, not a rational 2) Moreover, that rational is invalid as it is not reduced. Noticed by David MacMahon [ruby-core:57121] -- http://bugs.ruby-lang.org/