perl: March 2008 Archives

Rounding and int

| | Comments (2) | TrackBacks (0)

Came across a curious fact today. Try this out:

$ perl -e "print int(2.07 * 100)"

You get 206 not 207. Same rounding down happens with 2.01 2.03 and 2.05. As perldoc -f int says,

You should not use this function for rounding

One alternative is to use sprintf, for instance:

my $num = sprintf("%.0f",(2.07 * 100)); # returns 207

Or even, from the command line:

perl -e 'printf("%.0f",(2.07 * 100))' # returns 207

Or you could use Math::Round and let that do the thinking for you. ;)

Update

Recently (it's early September 2008) Microsoft released an update that made the original example in this entry fail with an error along to the lines of:

a:InternalServiceFault <faultstring xml:lang="en-GB">The server was unable to process the request due to an internal error.  For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the &lt;serviceDebug&gt; configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.</faultstring></s:Fault>

Thanks to a colleague, here's a very minor alteration that should fix the problem:

use SOAP::Lite; # +trace
use strict;

my $uri = 'http://www.webserviceX.NET';
my $url = 'http://www.webservicex.net/globalweather.asmx';

my $soap = SOAP::Lite
       ->uri($uri)
       ->on_action( sub { '"' . $uri . $_[1] . '"' } ) # surround with double quotes
       ->proxy($url)
       ->autotype(0);

# $soap->readable(1);

my $method = SOAP::Data->name('GetWeather')->attr({xmlns =>$uri});

my $result = $soap->call($method => (
      SOAP::Data->name('CityName')->value('Cambridge'),
      SOAP::Data->name('CountryName')->value('United Kingdom'),)
)->result;

The original example below probably works with .NET web services that haven't yet had the latest update from Microsoft applied:

use SOAP::Lite; # +trace
use strict;

my $uri = 'http://www.webserviceX.NET';
my $url = 'http://www.webservicex.net/globalweather.asmx';

my $soap = SOAP::Lite
       -> uri($uri)
       -> on_action( sub { join '/', $uri, $_[1] } )
       -> proxy($url);
       

$soap->autotype(0);
# $soap->readable(1);

my $method = SOAP::Data->name('GetWeather')->attr({xmlns =>$uri});

my $result = $soap->call($method => (
      SOAP::Data->name('CityName')->value('Cambridge'),
      SOAP::Data->name('CountryName')->value('United Kingdom'),)
)->result;

 

About this Archive

This page is a archive of entries in the perl category from March 2008.

perl: November 2007 is the previous archive.

perl: April 2008 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Powered by Movable Type 4.21-en