in reply to Rounding of a number...

Here's another way to approach it:

sub trunc { my ($float, $precision) = @_[0..1]; my @comp = split /\./, $float; chop $comp[1] while length($comp[1]) > $precision; #trim $comp[1].='0' for (length($comp[1])..$precision-1); #pad return "$comp[0].$comp[1]"; } printf ("%5.2f", trunc($yearlyamount/52,2));

This will, of course, fail utterly if you pass in anything less than pristine values. I leave data validation and error handling as an exercise to whatever masochist chooses this route. Of course, you could also implement it in this insane manner:

$weekly = int(($yearlyamount/52)*100); $weekly = s,\d{2}$,\.$&,; printf ("%5.2f", $weekly);

As a last resort, you could always:

$weekly = sprintf("%.3", $yearlyamount/52); chop($weekly); printf "%5.2", $weekly;

Anima Legato
.oO all things connect through the motion of the mind

Replies are listed 'Best First'.
Re^2: Rounding of a number...
by Anonymous Monk on Dec 27, 2004 at 16:02 UTC
    As a last resort, you could always:

    weekly = sprintf("%.3", $yearlyamount/52); chop($weekly); printf "%5.2", $weekly;
    Except that it will produce wrong values every now and then. It will produce a wrong value whenever $yearlyamount/52 is less than 0.0005 less than a whole number - but still less than said whole number. This causes the "%.3f" rounding to produce a ".000" number, of which the last 0 will be chopped. The final result will be a ".00" number. But it should have been a ".99" number.
    use POSIX "floor"; my $yearlyamount = 5199.98; my $weekly1 = sprintf("%.3f", $yearlyamount/52); chop($weekly1); my $weekly2 = floor(100*5199.98/52)/100; printf("%5.2f %5.2f\n", $weekly1, $weekly2); __END__ 100.00 99.99