# Is this a bug or a whole new concept?

**URL:** <https://www.ruby-forum.com/t/is-this-a-bug-or-a-whole-new-concept/184412>\
**Category:** Ruby\
**Created:** [March 2, 2010, 3:58am UTC](https://www.ruby-forum.com/t/is-this-a-bug-or-a-whole-new-concept/184412 "2010-03-02T03:58:33Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![scudco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/aca169/32.png) [@scudco](https://www.ruby-forum.com/u/scudco)\
**Post date:** [March 2, 2010, 3:58am UTC](https://www.ruby-forum.com/t/is-this-a-bug-or-a-whole-new-concept/184412/1 "2010-03-02T03:58:33Z")

</div>

Greetings,

I got a book on Ruby and I am trying to learn it piece by piece. I was  
a Perl programmer for a while so the syntax of Ruby is not too hard for  
me. What I don’t understand is the following and I thank you in advance  
for your help and input.

I have a variable named “num” that is set to “9.” I’m using the  
num.eql?() method to test whether or not num.eql?(9) and it gives me  
“true” in IRB - no surprise there. The next one below also gives me  
“true” since 18/2 is 9. I read in the book that if you want to force  
the result of an experssion to be a float, make one or both operands a  
floating number. So we have 18/2.0. But the result is “false.” How come?  
How come everytime I change either the number to float I get a false  
even though the expression is correct? At first I thought I’m not  
dividing numbers - rather maybe I’m dividing the value of the chars  
rather than their math value. But that’s not true as “18.to\_i/2.to\_i,”  
just like “18/2,” gives us “true.”

I’m all ears to hear the logic behind such behavior

Thanks again

irb(main):058:0\> num.eql?(9)  
=\> true  
irb(main):059:0\> num.eql?(18/2)  
=\> true  
irb(main):060:0\> num.eql?(18/2.0)  
=\> false  
irb(main):061:0\> num.eql?(18.0/2)  
=\> false  
irb(main):062:0\> num.eql?(18.0/2.0)  
=\> false  
irb(main):063:0\> num.eql?(18/2)  
=\> true  
irb(main):064:0\> num.eql?(18.0/2.to\_f)  
=\> false  
irb(main):065:0\> num.eql?(18.to\_f/2.to\_f)  
=\> false  
irb(main):066:0\> num.eql?(18.to\_f/2.to\_i)  
=\> false  
irb(main):067:0\> num.eql?(18.to\_i/2.to\_i)  
=\> true  
irb(main):068:0\>

---

<div class="post-metadata">

**Author:** ![scudco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/aca169/32.png) [@scudco](https://www.ruby-forum.com/u/scudco)\
**Post date:** [March 2, 2010, 4:08am UTC](https://www.ruby-forum.com/t/is-this-a-bug-or-a-whole-new-concept/184412/2 "2010-03-02T04:08:47Z")

</div>

Apologies…should have checked the documentation first…we are also  
comparing types with “eql?”

## num.eql?(numeric) =\> true or false

Returns true if num and numeric are the same type and have equal values.

1 == 1.0 #=\> true  
1.eql?(1.0) #=\> false  
(1.0).eql?(1.0) #=\> true

Adam Aa wrote:

> Greetings,
> 
> I got a book on Ruby and I am trying to learn it piece by piece. I was  
> a Perl programmer for a while so the syntax of Ruby is not too hard for  
> me. What I don’t understand is the following and I thank you in advance  
> for your help and input.
> 
> I have a variable named “num” that is set to “9.” I’m using the  
> num.eql?() method to test whether or not num.eql?(9) and it gives me  
> “true” in IRB - no surprise there. The next one below also gives me  
> “true” since 18/2 is 9. I read in the book that if you want to force  
> the result of an experssion to be a float, make one or both operands a  
> floating number. So we have 18/2.0. But the result is “false.” How come?  
> How come everytime I change either the number to float I get a false  
> even though the expression is correct? At first I thought I’m not  
> dividing numbers - rather maybe I’m dividing the value of the chars  
> rather than their math value. But that’s not true as “18.to\_i/2.to\_i,”  
> just like “18/2,” gives us “true.”
> 
> I’m all ears to hear the logic behind such behavior
> 
> Thanks again
> 
> irb(main):058:0\> num.eql?(9)  
> =\> true  
> irb(main):059:0\> num.eql?(18/2)  
> =\> true  
> irb(main):060:0\> num.eql?(18/2.0)  
> =\> false  
> irb(main):061:0\> num.eql?(18.0/2)  
> =\> false  
> irb(main):062:0\> num.eql?(18.0/2.0)  
> =\> false  
> irb(main):063:0\> num.eql?(18/2)  
> =\> true  
> irb(main):064:0\> num.eql?(18.0/2.to\_f)  
> =\> false  
> irb(main):065:0\> num.eql?(18.to\_f/2.to\_f)  
> =\> false  
> irb(main):066:0\> num.eql?(18.to\_f/2.to\_i)  
> =\> false  
> irb(main):067:0\> num.eql?(18.to\_i/2.to\_i)  
> =\> true  
> irb(main):068:0\>

---

<div class="post-metadata">

**Author:** ![scudco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/aca169/32.png) [@scudco](https://www.ruby-forum.com/u/scudco)\
**Post date:** [March 2, 2010, 4:09am UTC](https://www.ruby-forum.com/t/is-this-a-bug-or-a-whole-new-concept/184412/3 "2010-03-02T04:09:47Z")

</div>

On Mon, Mar 1, 2010 at 8:59 PM, Adam Aa [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> “true” in IRB - no surprise there. The next one below also gives me  
> “true” since 18/2 is 9. I read in the book that if you want to force  
> the result of an experssion to be a float, make one or both operands a  
> floating number. So we have 18/2.0. But the result is “false.” How come?  
> How come everytime I change either the number to float I get a false  
> even though the expression is correct? At first I thought I’m not  
> dividing numbers - rather maybe I’m dividing the value of the chars  
> rather than their math value. But that’s not true as “18.to\_i/2.to\_i,”  
> just like “18/2,” gives us “true.”
> 
> I’m all ears to hear the logic behind such behavior

#eql? checks to see if the receiver and the parameter have the same  
value. In Ruby, an integer like 9 is guaranteed not to be identical to  
a float like 9.0, even if mathematically they are the same (and the ==  
method says they are equal). The result of floating-point division  
(i.e. where one or both operands is a float) is a floating-point  
number.

From [http://ruby-doc.org/core/classes/Object.html#M000347](http://ruby-doc.org/core/classes/Object.html#M000347):

Equality—At the Object level, == returns true only if obj and other  
are the same object. Typically, this method is overridden in  
descendent classes to provide class-specific meaning.

Unlike ==, the equal? method should never be overridden by subclasses:  
it is used to determine object identity (that is, a.equal?(b) iff a is  
the same object as b).

The eql? method returns true if obj and anObject have the same value.  
Used by Hash to test members for equality. For objects of class  
Object, eql? is synonymous with ==. Subclasses normally continue this  
tradition, but there are exceptions. Numeric types, for example,  
perform type conversion across ==, but not across eql?, so:

1 == 1.0 #=\> true  
1.eql? 1.0 #=\> false
