Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

rounding to nearest

by Cockneyphil (Acolyte)
on Mar 22, 2003 at 09:08 UTC ( #245110=perlquestion: print w/replies, xml ) Need Help??

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

how can i round a variable (lets say $price = 418.00 ;) to the nearest 10 ie '420.00'

Replies are listed 'Best First'.
Re: rounding to nearest
by dakkar (Hermit) on Mar 22, 2003 at 09:18 UTC
    $nearest=10; $price=int(($price+$nearest/2)/$nearest)*$nearest;

    This is parametric on the "granularity"

    UPDATE: and it also works if $nearest is less than 1 (say you want to round to the nearest 0.5)

    -- 
            dakkar - Mobilis in mobile
    
Re: rounding to nearest
by rob_au (Abbot) on Mar 22, 2003 at 09:21 UTC
    How about the following?

    sub round { my ( $price, $round ) = @_; return int(( $price / $round ) + 0.5 ) * $round; } print round( 418, 10 ), "\n";

    The round subroutine takes two parameters, the number to be rounded and the nearest value to which you want it to be rounded to.

     

    perl -le 'print+unpack("N",pack("B32","00000000000000000000001001000001"))'

Re: rounding to nearest
by mojotoad (Monsignor) on Mar 22, 2003 at 15:40 UTC
    use Math::Round qw(nearest); $quote = 418.00; $price = nearest(10, $quote);

    I don't know if it's important, but this implementation deals properly with negative numbers. From Math::Round:

    sub nearest { my ($targ, @inputs) = @_; my @res = (); my $x; $targ = abs($targ) if $targ < 0; foreach $x (@inputs) { if ($x >= 0) { push @res, $targ * int(($x + $half * $targ) / $targ); } else { push @res, $targ * POSIX::ceil(($x - $half * $targ) / $targ); } } return (wantarray) ? @res : $res[0]; }

    Cheers,
    Matt

Re: rounding to nearest
by dws (Chancellor) on Mar 22, 2003 at 10:15 UTC
    how can i round a variable (lets say $price = 418.00 ;) to the nearest 10 ie '420.00'

    Be aware that in certain situations it's considered bad form to pretend to maintain precision at the hundredth level when you've just rounded the nearest 10. You might want to clarify whether '418.00' rounds to '420.00' or '420'.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://245110]
Approved by Courage
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (7)
As of 2022-06-29 09:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My most frequent journeys are powered by:









    Results (96 votes). Check out past polls.

    Notices?