Beefy Boxes and Bandwidth Generously Provided by pair Networks chromatic writing perl on a camel
Just another Perl shrine
 
PerlMonks  

String comparison of numbers

by dsb (Chaplain)
on Mar 09, 2006 at 15:08 UTC ( #535405=perlquestion: print w/ replies, xml ) Need Help??
dsb has asked for the wisdom of the Perl Monks concerning the following question:

This issue came up because I was setting some values using the rand() function, then requesting them through a SOAP request where the were received as strings. A numeric comparison between two numers that were seemingly the same failed:
# these two variables are indentical when printed to STDOUT $var1 = rand(1); $var2 = $soapres->dataof('//path/to/elem/')->attr->{attr}; if ( $var1 == $var2 ) { print "all is well\n"; } else { print "got problems?\n"; }
The comparison invariably failed. However, when I did a string comparison, it succeeded.
# these two variables are indentical when printed to STDOUT $var1 = rand(1); $var2 = $soapres->dataof('//path/to/elem/')->attr->{attr}; if ( $var1 eq $var2 ) { print "all is well\n"; } else { print "got problems?\n"; }
I'm guessing that this has something to do with the internal representation of the value returned by rand(). I'm guessing that the value is stored internally with a greater precision, so the numeric comparison between that value and the "truncated" value fails.

Of course...this is just my theory.


dsb
This @ISA my( $cool ) %SIG

Comment on String comparison of numbers
Select or Download Code
Re: String comparison of numbers
by philcrow (Priest) on Mar 09, 2006 at 15:21 UTC
    When comparing floating point numbers, you should either round them both to the same precision and compare or subtract one from the other and see if the abs of the result is small:
    if ( abs( $number1 - $number2 ) < $something_tiny ) { print "all is well.\n"; }
    Numerical analysts usually prefer the latter many programmers prefer the former.

    Phil

      Well, the two arguements need to be exactly identical. So, if that means using a truncated version of the rand() value, then that's what I'll do. I'm more curious as to if my theory is correct.


      dsb
      This @ISA my( $cool ) %SIG

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://535405]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2014-04-20 15:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (485 votes), past polls