in reply to Rounding error?

my $y = 1.5; $y = sprintf "%.0f", $y; my $x = 2.5; $x = sprintf "%.0f", $x; print "$y\n$x\n";

Still surprised? As pg says above, perl's rounding is unbiased - rather than rounding every .5 up, it always rounds to even. 1.5 and 2.5 both become 2.

Update: This is not documented. What is documented in perlfaq4 is this:

it probably pays not to trust whichever system rounding is being used by Perl, but to instead implement the rounding function you need yourself.

I downloaded 5.6.1 from AS, and as ikegami says below it rounds 1.5 to 2 and 2.5 up to 3. Oh, and this all has nothing to do with the original question ;)

Replies are listed 'Best First'.
Re^2: Rounding error?
by pg (Canon) on Oct 19, 2004 at 02:35 UTC

    This rule has its formal name, called "round to even".

    Update

    Sorry, I didn't notice that bmann already mentioned this term in his post ;-)

    Update 2

    To support what bmann said below, I tried this c code, regardless whether I define i as float or double, the round to even rule does apply. The c compiler I used is borland c 5.5, my PC is windows XP.

    #include <stdio.h> #include <stdlib.h> int main(int argc, char * * argv) { for (double i=0; i < 10; i += .5) { printf("%.1f: %.0f\n", i, i); } return 0; }
Re^2: Rounding error?
by ikegami (Patriarch) on Oct 19, 2004 at 02:55 UTC

    I'm surprised by your comment, not by the output, seeing as that prints 2 and 3 for me.

    ActivePerl 5.6.1
    ActivePerl 5.8.0

    If it did give 2 for both, I'd be asking: "Can someone explain the sense of a rounding where the following prints 19, not 20:"

    $sum += sprintf("%.0f", $_/10) foreach (0..19); print($sum, $/);
      That's strange. Here's the version of perl I ran it on originally

      C:\>perl -v This is perl, v5.8.4 built for MSWin32-x86-multi-thread (with 3 registered patches, see perl -V for more detail) Copyright 1987-2004, Larry Wall Binary build 810 provided by ActiveState Corp.

      I just ran it on 5.8.4 on debian - then 5.00503, 5.8.2 and 5.8.5 on FreeBSD. All versions round both 1.5 and 2.5 to 2

      Does anyone else get something different?

      for ($i=0;$i<10;$i+=.5){ printf "%.1f: %.0f\n", $i, $i; } __END__ Output: 0.0: 0 0.5: 0 1.0: 1 1.5: 2 2.0: 2 2.5: 2 3.0: 3 3.5: 4 4.0: 4 4.5: 4 5.0: 5 5.5: 6 6.0: 6 6.5: 6 7.0: 7 7.5: 8 8.0: 8 8.5: 8 9.0: 9 9.5: 10