diff options
author | Jeremy Evans <code@jeremyevans.net> | 2021-07-26 11:20:27 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2021-08-06 15:03:51 -0700 |
commit | d16b68cb2204eeb5af8bd39149202b630374c67f (patch) | |
tree | d14b41ad62a2ef2a5b2fc40f3917ffebf83d2d80 /rational.c | |
parent | 0d3520b063b304708699d3b7ea82b0a5b0279555 (diff) |
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>
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/4682
Diffstat (limited to 'rational.c')
-rw-r--r-- | rational.c | 6 |
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) { |