Space Ship Operator <=> Odd Behaviour

N

Nathanial Allan

I have come across a strange occurance when I use the space ship
operator to compare percentages.

I want to compare percentages to see if they are greater than, less than
or equal to 85%, this mostly works fine - all the way up to 99% - it
returns a 1 obviously meaning that 99% is greater than 85%

however the strangeness comes in when I attempt to compare 100% or
greater against 85% - it returns -1

I am fairly new to ruby - by no means an expert so I suspect there is
something wrong with what I am doing rather than the spaceship operator.
Can someone please shine some light on this for me so that I may better
understand.

I have the knowledge to perform this operation another way with differnt
code, but I am interested to know why - if there is a logical
explaination.

Thanks in advance!
 
R

(r.*n){2}

I have come across a strange occurance when I use the space ship
operator to compare percentages.

I want to compare percentages to see if they are greater than, less than
or equal to 85%, this mostly works fine - all the way up to 99% - it
returns a 1 obviously meaning that 99% is greater than 85%

however the strangeness comes in when I attempt to compare 100% or
greater against 85% - it returns -1

I am fairly new to ruby - by no means an expert so I suspect there is
something wrong with what I am doing rather than the spaceship operator.
Can someone please shine some light on this for me so that I may better
understand.

I have the knowledge to perform this operation another way with differnt
code, but I am interested to know why - if there is a logical
explaination.

Thanks in advance!

that is because the sort being performed is alphanumeric instead of
numeric. In the example below, z has the correct sorted values. Due to
the way to_i is defined, '10%'.to_i is same as '10'.to_i.

x = [ '35%', '25%', '5%', '10%', '100%', '15%' ]
y = x.sort { |a,b| a <=> b }
z = x.sort { |a,b| a.to_i <=> b.to_i }
puts "x is:"
p x
puts "y is:"
p y
puts "z is:"
p z

Output:
x is:
["35%", "25%", "5%", "10%", "100%", "15%"]
y is:
["10%", "100%", "15%", "25%", "35%", "5%"]
z is:
["5%", "10%", "15%", "25%", "35%", "100%"]
 
S

Stefano Crocco

|I have come across a strange occurance when I use the space ship
|operator to compare percentages.
|
|I want to compare percentages to see if they are greater than, less than
|or equal to 85%, this mostly works fine - all the way up to 99% - it
|returns a 1 obviously meaning that 99% is greater than 85%
|
|however the strangeness comes in when I attempt to compare 100% or
|greater against 85% - it returns -1
|
|I am fairly new to ruby - by no means an expert so I suspect there is
|something wrong with what I am doing rather than the spaceship operator.
|Can someone please shine some light on this for me so that I may better
|understand.
|
|I have the knowledge to perform this operation another way with differnt
|code, but I am interested to know why - if there is a logical
|explaination.
|
|Thanks in advance!

What kind of object are you using to represent percentages? From the way you
worded your question, I think you're using strings, that is you're writing
something like

"99%" <=> "85%"

If this is the case, then it's no wonder that "100%" <=> "85%" returns -1: the
spaceship operator on strings compares them in alphabetical order, which means
that "100%" should indeed came first. To compare the two numerical values, you
have to convert them to numerical classes. How to do this depends on your
exact needs. For example, if you're sure that all your percentages are integer
values, you can simply do something like:

perc_1="100%"[0...-1].to_i
perc_2="85%"[0...-1].to_i
perc_1 <=> perc_2

This should give you the correct result. If your percentages can be non
integers (i.e. "94.42%"), you'll have to convert them to Float or Rational.

I hope this helps

Stefano
 
R

Robert Klemme

|I have come across a strange occurance when I use the space ship
|operator to compare percentages.
|
|I want to compare percentages to see if they are greater than, less than
|or equal to 85%, this mostly works fine - all the way up to 99% - it
|returns a 1 obviously meaning that 99% is greater than 85%
|
|however the strangeness comes in when I attempt to compare 100% or
|greater against 85% - it returns -1
|
|I am fairly new to ruby - by no means an expert so I suspect there is
|something wrong with what I am doing rather than the spaceship operator.
|Can someone please shine some light on this for me so that I may better
|understand.
|
|I have the knowledge to perform this operation another way with differnt
|code, but I am interested to know why - if there is a logical
|explaination.
|
|Thanks in advance!

What kind of object are you using to represent percentages? From the way you
worded your question, I think you're using strings, that is you're writing
something like

"99%"<=> "85%"

If this is the case, then it's no wonder that "100%"<=> "85%" returns -1: the
spaceship operator on strings compares them in alphabetical order, which means
that "100%" should indeed came first. To compare the two numerical values, you
have to convert them to numerical classes. How to do this depends on your
exact needs. For example, if you're sure that all your percentages are integer
values, you can simply do something like:

perc_1="100%"[0...-1].to_i
perc_2="85%"[0...-1].to_i
perc_1<=> perc_2

This should give you the correct result. If your percentages can be non
integers (i.e. "94.42%"), you'll have to convert them to Float or Rational.

Note: you don't need the sub range with #to_i if the number is the
beginning:

irb(main):001:0> '123%'.to_i
=> 123

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top