Bug #13062

2.4.0-rc1 BigDecimal regression - to_d inconsistent with other numeric classes

Added by jhawthorn (John Hawthorn) 10 months ago. Updated 7 months ago.

Target version:


To solve #10286, BigDecimal() was changed to raise exceptions on invalid input, which is more consistent with the other numeric types.

Unfortunately, String#to_d now also raises errors, which is inconsistent with the other to_* methods (to_i, to_f), which return 0 on error.

Under ruby 2.4.0-rc1:

> require 'bigdecimal'
> require 'bigdecimal/util'
> "invalid".to_d
ArgumentError: invalid value for BigDecimal(): "invalid"
> "invalid".to_i
=> 0
> "invalid".to_f
=> 0.0

Under ruby 2.3.3 or 2.4.0preview3:

> "invalid".to_d
=> #<BigDecimal:55871ca1f808,'0.0',9(9)>
> "invalid".to_i
=> 0
> "invalid".to_f
=> 0.0

There's also a further problem that BigDecimal() still doesn't behave the same as Integer() when given a string with the number at the start:

Under ruby 2.4.0-rc1:

> BigDecimal("2 turtle doves")
=> 0.2e1
> Integer("2 turtle doves")
ArgumentError: invalid value for Integer(): "2 turtle doves"
> Float("2 turtle doves")
ArgumentError: invalid value for Float(): "2 turtle doves"

So BigDecimal is still inconsistent.

fix_13062_string_to_d.patch (1.57 KB) fix_13062_string_to_d.patch Esse (Piotr Szmielew), 12/25/2016 12:16 AM


#1 [ruby-core:78823] Updated by Esse (Piotr Szmielew) 10 months ago

In attachment you will find patch for this issue.

This patch fixes issue with String#to_d method which was inconsistent with other to_d methods (String one returned error, while other simply returns 0).

Also, there tests added for this case.

#2 [ruby-core:79086] Updated by mrkn (Kenta Murata) 9 months ago

  • Assignee set to mrkn (Kenta Murata)
  • Status changed from Open to Assigned

#3 [ruby-core:79652] Updated by mrkn (Kenta Murata) 8 months ago

  • Status changed from Assigned to Closed

Fixed in bigdecimal 1.3.1 and ruby trunk.

#4 [ruby-core:79750] Updated by rafaelfranca (Rafael Fran├ža) 8 months ago

Is this going to be backported to 2.4?

#5 [ruby-core:80289] Updated by abezzub (Andrew Bezzub) 7 months ago

I can reproduce this in 2.4.1. Is this going to be fixed in 2.4.2? This is a significant issue that makes it hard to upgrade to Ruby 2.4.

#6 [ruby-core:80297] Updated by hsbt (Hiroshi SHIBATA) 7 months ago

You can install and use bigdecimal-1.3.1 via standalone gem with Ruby 2.4

#7 [ruby-core:80298] Updated by abezzub (Andrew Bezzub) 7 months ago

1.3.1 still had the problem, but 1.3.2 worked, thanks! It would still be nice if this was ported over to 2.4.x

Also available in: Atom PDF