On Dec 5, 7:31 am, Jason Roelofs <jameskil... / gmail.com> wrote:
> Note:  parts of this message were removed by the gateway to make it a legal Usenet post.
>
> On Dec 5, 2007 9:15 AM, Phrogz <phr... / mac.com> wrote:
>
>
>
> > On Dec 5, 4:54 am, hemant <gethem... / gmail.com> wrote:
> > > On Dec 5, 2007 5:22 PM, hemant <gethem... / gmail.com> wrote:
>
> > > > On Dec 5, 2007 5:00 PM, Ivo Dancet <caifara.subscr... / gmail.com>
> > wrote:
> > > > > Hi
>
> > > > > I thought, why search for two hours being totally frustrated if I
> > can
> > > > > just ask...
>
> > > > > why does this happen:
>
> > > > >  >> 73.07-63.00
> > > > > => 10.07 # ok, normal!
> > > > >  >> 73.07-64.00
> > > > > => 9.06999999999999 # why oh why?
>
> > > > Thats folly of floats, you can't do much apart from :
>
> > > > sprintf("%.2f",(73.07-64.00)).to_f
>
> > > generally, I add a method to Float class like this:
>
> > > class Float
> > >   def r2p places
> > >     sprintf("%.#{places}f",self).to_f
> > >   end
> > > end
>
> > Note that, due to the nature of floats, calling to_f on that string
> > brings you back into the problem again:
>
> > x = ( 73.07 - 64.00 )
> > y = x.r2p( 2 )
> > p x, y, "%.20f" % y
>
> > #=> 9.06999999999999
> > #=> 9.07
> > #=> "9.07000000000000028422"
>
> require 'bigdecimal'
> require 'bigdecimal/math'
> include BigMath
>
> (BigDecimal("73.07") - BigDecimal("64.00")).to_f   #=> 9.07
>
> http://www.ruby-doc.org/stdlib/libdoc/bigdecimal/rdoc/index.html

irb(main):002:0> require 'bigdecimal'
irb(main):003:0> require 'bigdecimal/math'
irb(main):004:0> include BigMath
irb(main):005:0> y = (BigDecimal("73.07") - BigDecimal("64.00")).to_f
=> 9.07
irb(main):006:0> "%.20f" % y
=> "9.07000000000000028422"

You might not see the problem on that particular output, but the
potential inaccuracy still exists as long as you're in the Float
domain.