From: Robert Klemme Date: 2007-07-17T16:30:00+09:00 Subject: Re: Force calculation result to BigDecimal 2007/7/17, Todd Benson : > On 7/16/07, Robert Brown wrote: > > Hi all, > > > > I'm doing some complex math which I need to be based on BigDecimal > > accuracy (not Float). It seems that ruby defaults to Float when there's > > a mixture of type in there, e.g. > > > > Code : > > > > 1. irb(main):001:0> require 'bigdecimal' > > 2. => true > > 3. irb(main):002:0> a = 5.123 > > 4. => 5.123 > > 5. irb(main):003:0> b = BigDecimal("6.789") > > 6. => # > > 7. irb(main):004:0> c = a * b > > 8. => 34.780047 > > 9. irb(main):005:0> c.class > > 10. => Float > > > > Is there a way I can force a BigDecimal outcome. > > > > One way I guess would work is to make sure all args in the calculation > > are BigDecimal, but that's a bit tiresome. For a start, I'd have to > > type check each arg and convert to BigDecimal if it was not BigDecimal - > > that's gotta be slow... > > > > On a related note, how do I initalize a BigDecimal from a Float (without > > converting to string first). How could I extend BigDecimal for this? > > > > > > Thanks, > > > > > > > > Rob > > Here's a quick fix. There may be a better way to handle this, though. Hm.... I don't think this is a fix because once you have a float you lost all the precision. A better fix is probably to change #coerce to work properly. Another solution is to make sure all values are converted to BD before starting the calculation. Note, that BigDecimal is returned when working with integers. > Again, I'll give the usual warning about modifying core classes: you > shouldn't normally do it unless you can be certain it won't break > yours or anyone else's code. Very good point! Kind regards robert