# Space Ship Operator <=> Odd Behaviour

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.

···

--
Posted via http://www.ruby-forum.com/.

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%"]

···

On Sep 27, 10:13 pm, Nathanial Allan <nathanial.al...@gmail.com> wrote:

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.

--
Posted viahttp://www.ruby-forum.com/.

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

···

On Tuesday 28 September 2010, Nathanial Allan wrote:

>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.
>

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

···

On 09/28/2010 09:09 AM, Stefano Crocco wrote:

On Tuesday 28 September 2010, Nathanial Allan wrote:

>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.
>

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.