Forum: Ruby what's easiest way to compare a Float & BigDecimal (i.e. like a equals mechanism)

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Greg H. (Guest)
on 2008-11-08 08:31
(Received via mailing list)
Hi,

what's easiest way to compare a Float & BigDecimal (i.e. like a equals
mechanism)?  It seems that "==" does NOT work as they are different
types.  Is there a way to do a comparison without having to convert
types?

?> a
=> #<BigDecimal:2395e98,'0.65E1',8(8)>
>> x
=> 6.5
>> a == x
=> false      #<<== DIDN'T WORK
>>

tks
Michael M. (Guest)
on 2008-11-08 09:05
(Received via mailing list)
Greg H. wrote:
> => 6.5
>>> a == x
> => false      #<<== DIDN'T WORK
>
> tks
>


It works fine for me.  If I do something like this:

f = 0.1
b = BigDecimal.new('0.1')
puts 'yes' if f == b

It will return true.  I've always stayed clear of the equality operator
with floating point numbers.  Floating point cannot represent all
numbers exactly, so comparing it with something like a BigDecimal (which
can represent all numbers exactly) might be problematic.
Greg H. (Guest)
on 2008-11-08 09:47
(Received via mailing list)
that works - but my 6.5 number doesn't work - does the following also
not work for you?

>> a = BigDecimal.new('6.5')
=> #<BigDecimal:238875c,'0.65E1',8(8)>
>> b = 6.5
=> 6.5
>> a == b
=> false
>> a.class
=> BigDecimal
>> b.class
=> Float
>>
Robert Parker (Guest)
on 2008-11-08 09:58
(Received via mailing list)
On Sat, Nov 8, 2008 at 2:44 PM, Greg H.
<removed_email_address@domain.invalid> wrote:
> => BigDecimal
>>> b.class
> => Float
>>>
>

You can rely on comparing floating point numbers for less than or
greater than only.
You can not reliably compare floating point numbers for equality period.
pen (Guest)
on 2008-11-08 22:15
(Received via mailing list)
On Nov 8, 8:26 am, Greg H. <removed_email_address@domain.invalid>
wrote:
> Hi,
>
> what's easiest way to compare a Float & BigDecimal (i.e. like a equals
> mechanism)?  It seems that "==" does NOT work as they are different
> types.  Is there a way to do a comparison without having to convert
> types?

Actually, there is none. Why don't you just let Ruby do the job and
multiply the bigdecimal with 1.0 when comparing? Also, as previously
noted, == operator with floats is not ... reliable.

br,

  pen
Greg H. (Guest)
on 2008-11-08 22:25
(Received via mailing list)
oh so convert the BigDecimal to a float by multiplying by 1.0 you mean
first?
Michael M. (Guest)
on 2008-11-10 09:30
(Received via mailing list)
Greg H. wrote:
>>> types?
>> Actually, there is none. Why don't you just let Ruby do the job and
>> multiply the bigdecimal with 1.0 when comparing? Also, as previously
>> noted, == operator with floats is not ... reliable.
>>
>> br,
>>
>>  pen
>>
>>
>

BigDecimal objects should have a to_f method.  Using that would probably
be more clear than multiplying by 1.0 (a seamingly meaningless thing to
do).
Mark T. (Guest)
on 2008-11-10 18:51
(Received via mailing list)
On Nov 8, 1:26 am, Greg H. <removed_email_address@domain.invalid>
wrote:
> >> a == x
>
> => false      #<<== DIDN'T WORK

I thought I saw a similar discussion not too long ago... aha:

http://groups.google.com/group/comp.lang.ruby/msg/...

With the approx_equal? method in that thread, this works:

a = BigDecimal.new('6.5')
f = 6.5
f == a
#=> false
f.approx_equal?(a, 0.00000000001)
#=> true


-- Mark.
This topic is locked and can not be replied to.