Paritosh Patel [tosh AT us.ibm.com] wrote:
> I am using ActiveState Perl and I am getting interesting results with
I
> use the int() function. Essentially, I get different results as in the
> following. Is this normal for Perl?
>
> I have narrowed my code to the following simple scenario:
>
> my $a = 31.0;
> my $b = 1.8;
> my $c = 2.9;
>
> my $sumy = $a + $b + $c; # $sumy = 35.7
>
> my $yten = $sumy * 10;
> my $ytenint = int($sumy*10);
>
> print "x = " . $yten . " \n"; # output> 357
> print "xint = " . $ytenint . " \n"; # output> 356
>
>
> The output is:
>
> x = 357
> xint = 356
>
> There is some rounding going on which is not intuitive. I am a
> C/C++ programmer and am surprised at the output. What should I be
using?
>
> - Tosh
You are a C/C++ programmer and you do not realize that representation
of non-base2 fraction digits are not represented exactly via floats?
Perldoc on the int() function:
int EXPR
int
Returns the integer portion of EXPR. If EXPR is omitted, uses $_.
You should not use this function for rounding: one because it truncates
towards 0, and two because machine representations of floating point
numbers can sometimes produce counterintuitive results. For example,
int(-6.725/0.025) produces -268 rather than the correct -269; that's
because it's really more like -268.99999999999994315658 instead.
Usually,
the sprintf, printf, or the POSIX::floor and POSIX::ceil functions
will serve you better than will int().
--
Mike Arms
_______________________________________________
ActivePerl mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs