BigDecimal bug?

Discussion in 'Ruby' started by Mark Somerville, Mar 13, 2007.

  1. Hello,

    Can anyone tell me if this is a bug? It certainly seems like it to me.

    >> BigDecimal.new("-.31").to_s

    => "0.31"

    $ ruby -v
    ruby 1.8.5 (2006-12-04 patchlevel 2) [x86_64-linux]

    I have tried altering the BigDecimal initialisation code, without success.
    Does anyone have any clues as to how to workaround this issue without
    pre-processing the "-.31" string? I'd think I could alter the "new" call to
    alter the malformed string a little.

    Thanks a lot in advance,

    Mark
    Mark Somerville, Mar 13, 2007
    #1
    1. Advertising

  2. On Tue, Mar 13, 2007 at 08:08:07PM +0900, Mark Somerville wrote:
    > I have tried altering the BigDecimal initialisation code, without success.
    > Does anyone have any clues as to how to workaround this issue without
    > pre-processing the "-.31" string? I'd think I could alter the "new" call to
    > alter the malformed string a little.


    I've managed to get a workaround going now (I realise this is a poor
    substitute for fixing the poorly formed decimals), but I don't understand why I need
    to wrap the alias_method inside class << self. Can anyone explain it to me?

    class BigDecimal

    #why do I need to wrap this in class << self ???
    class << self
    alias_method 'original_new', 'new'
    end

    def self.new(value)
    value = "-0.#{$1}" if value =~ /^-\.(.+)$/
    return original_new(value)
    end

    end

    Cheers,

    Mark
    Mark Somerville, Mar 13, 2007
    #2
    1. Advertising

  3. Alle marted=EC 13 marzo 2007, Mark Somerville ha scritto:
    > I don't understand why I need
    > to wrap the alias_method inside class << self. Can anyone explain it to m=

    e?

    alias_method works for instance methods (i.e, a method of instances of clas=
    s=20
    BigDecimal). You're aliasing a class method (new), that is an instance meth=
    od=20
    of the class BigDecimal. To do so, you should enter a scope where self is n=
    ot=20
    the class BigDecimal, but BigDecimal's class. This way, new is seen as an=20
    instance method (i.e. a method of instances of the class of BigDecimal, i.e=
    =2E=20
    of BigDecimal). This is what you do with the class << self construct.

    I hope this explaination makes sense (if it doesn't, tell me and I'll try t=
    o=20
    clarify)

    Stefano
    Stefano Crocco, Mar 13, 2007
    #3
  4. On Mar 13, 5:08 am, Mark Somerville <> wrote:
    > Hello,
    >
    > Can anyone tell me if this is a bug? It certainly seems like it to me.
    >
    > >> BigDecimal.new("-.31").to_s

    >
    > => "0.31"
    >
    > $ ruby -v
    > ruby 1.8.5 (2006-12-04 patchlevel 2) [x86_64-linux]


    Looks like a bug to me. I think it's in the VpToString() function
    being called by the BigDecimal_to_s() function. I'm not positive,
    though, as the code is long and ugly.

    Please submit a bug report to ruby-core.

    Thanks,

    Dan
    Daniel Berger, Mar 13, 2007
    #4
  5. On Tue, Mar 13, 2007 at 08:51:02PM +0900, Stefano Crocco wrote:
    > Alle martedì 13 marzo 2007, Mark Somerville ha scritto:
    > > I don't understand why I need
    > > to wrap the alias_method inside class << self. Can anyone explain it to me?

    >
    > alias_method works for instance methods (i.e, a method of instances of class
    > BigDecimal). You're aliasing a class method (new), that is an instance method
    > of the class BigDecimal. To do so, you should enter a scope where self is not
    > the class BigDecimal, but BigDecimal's class. This way, new is seen as an
    > instance method (i.e. a method of instances of the class of BigDecimal, i.e.
    > of BigDecimal). This is what you do with the class << self construct.
    >
    > I hope this explaination makes sense (if it doesn't, tell me and I'll try to
    > clarify)


    Thanks a lot Stefano, that explanation was exactly what I needed.

    Mark
    Mark Somerville, Mar 13, 2007
    #5
  6. On Wed, Mar 14, 2007 at 01:31:32AM +0900, Daniel Berger wrote:
    > On Mar 13, 5:08 am, Mark Somerville <> wrote:
    > > Hello,
    > >
    > > Can anyone tell me if this is a bug? It certainly seems like it to me.
    > >
    > > >> BigDecimal.new("-.31").to_s

    > >
    > > => "0.31"
    > >
    > > $ ruby -v
    > > ruby 1.8.5 (2006-12-04 patchlevel 2) [x86_64-linux]

    >
    > Looks like a bug to me. I think it's in the VpToString() function
    > being called by the BigDecimal_to_s() function. I'm not positive,
    > though, as the code is long and ugly.
    >
    > Please submit a bug report to ruby-core.


    Sure, done.

    Mark
    Mark Somerville, Mar 13, 2007
    #6
  7. Subject: Re: BigDecimal bug?


    > Can anyone tell me if this is a bug? It certainly seems like it to me.
    > BigDecimal.new("-.31").to_s
    > => "0.31"

    Yes,could you apply the patch bellow:
    ---------------------------------------------------------------------------------
    $ ruby/ruby-1.8.6/ext/bigdecimal
    $ diff -up bigdecimal.c.old bigdecimal.c
    --- bigdecimal.c.old 2007-03-14 10:21:30.015625000 +0900
    +++ bigdecimal.c 2007-03-14 12:26:18.625000000 +0900
    @@ -3921,7 +3921,7 @@ VpCtoV(Real *a, const char *int_chr, U_L
    /* get integer part */
    i = 0;
    sign = 1;
    - if(ni > 0) {
    + if(ni >= 0) {
    if(int_chr[0] == '-') {
    sign = -1;
    ++i;
    ---------------------------------------------------------------------------------

    Matz, could you please apply the patch and commit the source
    with the change log ?
    Somewhat like:
    Wed Mar 14 12:30:00 2007 Shigeo Kobayashi <>

    * ext/bigdecimal/bigdecimal.c: BigDecimal("-.31") is now
    treated as ("-0.31") not as ("0.31").

    Thank you in advance.

    Shigeo Kobayashi
    Shigeo Kobayashi, Mar 14, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    3
    Views:
    1,220
  2. Zachi
    Replies:
    5
    Views:
    480
    Zachi
    Apr 28, 2007
  3. Stanimir Stamenkov
    Replies:
    4
    Views:
    2,578
    Stanimir Stamenkov
    Jul 18, 2008
  4. Ryan Platte

    Bug in BigDecimal#round ?

    Ryan Platte, Sep 26, 2007, in forum: Ruby
    Replies:
    7
    Views:
    142
    Shigeo Kobayashi
    Oct 9, 2007
  5. Maciej Tomaka

    BigDecimal with Float comparision bug.

    Maciej Tomaka, Aug 26, 2008, in forum: Ruby
    Replies:
    9
    Views:
    141
    Victor H. Goff III
    Aug 28, 2008
Loading...

Share This Page