Is this a bug or a whole new concept?

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>

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>

On Mon, Mar 1, 2010 at 8:59 PM, Adam Aa [email protected] 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:

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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs