Issue #9316 has been updated by al2o3cr (Matt Jones).


phasis68 (Heesob Park) wrote:

> Here is a simple patch to ensure the minimun precison of division result.
>      
> diff --git a/bigdecimal.c b/bigdecimal.c.new
> index e0b7c01..615c15f 100644
> --- a/bigdecimal.c
> +++ b/bigdecimal.c.new
> @@ -1222,6 +1222,7 @@ BigDecimal_divide(Real **c, Real **res, Real **div, VALUE self, VALUE r)
>      *div = b;
>      mx = a->Prec + vabs(a->exponent);
>      if (mx<b->Prec + vabs(b->exponent)) mx = b->Prec + vabs(b->exponent);
> +    if (mx<3) mx = 3;
>      mx =(mx + 1) * VpBaseFig();
>      GUARD_OBJ((*c), VpCreateRbObject(mx, "#0"));
>      GUARD_OBJ((*res), VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0"));
> @@ -1323,6 +1324,7 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
>  
>      mx = a->Prec + vabs(a->exponent);
>      if (mx<b->Prec + vabs(b->exponent)) mx = b->Prec + vabs(b->exponent);
> +    if (mx<3) mx = 3;    
>      mx = (mx + 1) * VpBaseFig();
>      GUARD_OBJ(c, VpCreateRbObject(mx, "0"));
>      GUARD_OBJ(res, VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0"));

Not a fan of this, since it's updating code that didn't change between the two releases (as far as I can tell). I'd prefer to fix the underlying reason why identical calculations in 2.0 and 2.1 aren't behaving the same way instead of just arbitrarily forcing more precision...
----------------------------------------
Bug #9316: BigDecimal division in Ruby 2.1
https://bugs.ruby-lang.org/issues/9316#change-44026

Author: abernardes (Andre Bernardes)
Status: Assigned
Priority: Normal
Assignee: mrkn (Kenta Murata)
Category: lib
Target version: current: 2.2.0
ruby -v: ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin13.0]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN


=begin
When updating an app to Ruby 2.1, and I ran into the following difference between ruby 2.0.0-p353 and ruby 2.1.0 when dividing two BigDecimals:

((*Ruby 2.0.0p353:*))
 2.0.0p353 :002 > (BigDecimal.new("1472.0") / BigDecimal.new("0.99")).to_f
  => 1486.868686869

((*Ruby 2.1.0p0:*))
 2.1.0p0 :006 > (BigDecimal.new("1472.0") / BigDecimal.new("0.99")).to_f
  => 1487.0
=end


-- 
http://bugs.ruby-lang.org/