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>
This commit is contained in:
Jeremy Evans 2021-07-26 11:20:27 -07:00
parent 0d3520b063
commit d16b68cb22
Notes: git 2021-08-07 07:04:11 +09:00
4 changed files with 19 additions and 0 deletions

View file

@ -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)
{