[rspec-users] Why can not a BigDecimal be compared to a Float via "==". How should I handle this???

Greg Hauptmann greg.hauptmann.ruby at gmail.com
Sun Jan 11 17:36:42 EST 2009


ok - thanks - seems like if one remembers to use "BigDecimal('10.1')", then
instead of 10.1 in your code you should be ok then.

On Mon, Jan 12, 2009 at 6:45 AM, Maurício Linhares <
mauricio.linhares at gmail.com> wrote:

> This is a very bad idea, as you can break the whole runtime by doing
> this, as many internal classes use floating point math. You would also
> slow the world down, as operations using BigDecimals are some order of
> magnitude slower than pure floating point math.
>
> -
> Maurício Linhares
> http://alinhavado.wordpress.com/ (pt-br) | http://blog.codevader.com/ (en)
>
>
>
> On Sun, Jan 11, 2009 at 6:33 PM, Greg Hauptmann
> <greg.hauptmann.ruby at gmail.com> wrote:
> > it would be nice in one's project if you could basically say "use
> > BigDecimal wherever you normally would have used a float", just to get
> the
> > benefit but maintain ease of coding/readability etc - anyone know if this
> is
> > possible?   Would it be enough to override Float's initializer and return
> a
> > BigDecimal instead?
> >
> >
> > On Mon, Jan 12, 2009 at 4:53 AM, Rick DeNatale <rick.denatale at gmail.com>
> > wrote:
> >>
> >> On Sun, Jan 11, 2009 at 9:21 AM, David Chelimsky <dchelimsky at gmail.com>
> >> wrote:
> >>>
> >>> On Sun, Jan 11, 2009 at 4:05 AM, Greg Hauptmann
> >>> <greg.hauptmann.ruby at gmail.com> wrote:
> >>> > I've gone with the following
> >>> >      ai.amount.should == BigDecimal('-323.03')
> >>> > However I'm still a bit surprised that Ruby itself does allow a good
> >>> > "=="
> >>> > test between a Float and a BigDecimal.  Perhaps there's a reason that
> >>> > I'm
> >>> > missing?
> >>>
> >>> Very telling is this:
> >>>
> >>> >> require 'bigdecimal'
> >>> => true
> >>> >> BigDecimal.new(3333333.0) == 3333333.0
> >>> TypeError: can't convert Float into String
> >>>        from (irb):4:in `new'
> >>>        from (irb):4
> >>>
> >>> As for why, I think you'll get some good insights if you post the
> >>> ruby-lang mailing list, but I can take shot.
> >>>
> >>> BigDecimal has explicit precision. Float does not. Imagine the
> >>> developer at the bank explaining that the thousands of dollars
> >>> discrepancy last year was due to an average miscalculation of 0.00005
> >>> per transaction because sometimes the code used BigDecimal, and
> >>> sometimes it used Float.
> >>
> >> Even more telling is this:
> >> irb(main):001:0> 1.0 / 3.0
> >> => 0.333333333333333
> >> irb(main):002:0> (1.0 / 3.00) ==  0.333333333333333
> >> => false
> >>
> >> This has little to do with rspec or Ruby, and everything to do with
> >> floats.
> >>
> >> Floats are approximations, it's a mistake to thing of them as equivalent
> >> to the mathematical concept of real numbers, or even rational numbers.
> There
> >> are several issues here including
> >>
> >> 1. Floats are not infinite precision, they have a fixed number of bits
> or
> >> digits, this means that in-between any two consecutive real number which
> CAN
> >> be represented by a float, there are an infinite number of reals which
> >> cannot.
> >>
> >> 2. As is the case in decimal fractions, where some rational numbers such
> >> as 1/3 cannot be represented without an infinite number of decimal
> digits,
> >> there are similar values dependent on the base used for the float
> >> representation.
> >>
> >> There's a whole branch of computer science, Numerical Analysis,
> comprised
> >> in large part of understanding how Floats differ from the mathematical
> >> ideal.
> >>
> >>
> >> --
> >> Rick DeNatale
> >>
> >> Blog: http://talklikeaduck.denhaven2.com/
> >> Twitter: http://twitter.com/RickDeNatale
> >>
> >> _______________________________________________
> >> rspec-users mailing list
> >> rspec-users at rubyforge.org
> >> http://rubyforge.org/mailman/listinfo/rspec-users
> >
> >
> >
> > --
> > Greg
> > http://blog.gregnet.org/
> >
> >
> >
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
> >
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>



-- 
Greg
http://blog.gregnet.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20090112/a905be4e/attachment-0001.html>


More information about the rspec-users mailing list