http://qs321.pair.com?node_id=718178

pysome has asked for the wisdom of the Perl Monks concerning the following question:

I found a odd question when i wanna round a float number
with Perl buildin function "sprintf" my code is
use warnings; use strict; my $price1 = sprintf("%.1f",100.550); my $price2 = sprintf("%.0f",100.50); print "$price1\n"; # price1 has rounded print "$price2\n"; # but price2 hasn't , Why?
Of course, i can use the manual round function like some referrence:
sub round { my $f = @_; return int($f + .5); }
But the question is Why $price1 has been rounded and price2 has not been rounded?

Replies are listed 'Best First'.
Re: A bug of sprintf or not?
by ikegami (Patriarch) on Oct 20, 2008 at 10:20 UTC
    Anonymous Monk is mistaken. This isn't a precision issue. It's banker's rounding.
    printf("%.0f\n", 100.5); # 100 printf("%.0f\n", 101.5); # 102 printf("%.0f\n", 102.5); # 102 printf("%.0f\n", 103.5); # 104 printf("%.0f\n", 104.5); # 104 printf("%.0f\n", 105.5); # 106

    Note that all those numbers (but not 100.55) can be represented precisely in floats (0.5 = 2-1).

    A reply falls below the community's threshold of quality. You may see it by logging in.
Re: A bug of sprintf or not?
by Anonymous Monk on Oct 20, 2008 at 10:02 UTC