summaryrefslogtreecommitdiff
path: root/rational.c
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2021-07-26 11:20:27 -0700
committerJeremy Evans <code@jeremyevans.net>2021-08-06 15:03:51 -0700
commitd16b68cb2204eeb5af8bd39149202b630374c67f (patch)
treed14b41ad62a2ef2a5b2fc40f3917ffebf83d2d80 /rational.c
parent0d3520b063b304708699d3b7ea82b0a5b0279555 (diff)
downloadruby-d16b68cb2204eeb5af8bd39149202b630374c67f.tar.gz
Use Rational for Float#round with ndigits > 14
ndigits higher than 14 can result in values that are slightly too large due to floating point limitations. Converting to rational for the calculation and then back to float fixes these issues. Fixes [Bug #14635] Fixes [Bug #17183] Co-authored by: Yusuke Endoh <mame@ruby-lang.org>
Diffstat (limited to 'rational.c')
-rw-r--r--rational.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/rational.c b/rational.c
index 76a4264e0a..7324f78621 100644
--- a/rational.c
+++ b/rational.c
@@ -1540,6 +1540,12 @@ nurat_round_n(int argc, VALUE *argv, VALUE self)
return f_round_common(argc, argv, self, round_func);
}
+VALUE
+rb_flo_round_by_rational(int argc, VALUE *argv, VALUE num)
+{
+ return nurat_to_f(nurat_round_n(argc, argv, float_to_r(num)));
+}
+
static double
nurat_to_double(VALUE self)
{