Contributed by Anonymous Monk
on Jul 25, 2000 at 23:48 UTC
Q&A
> math
Answer: How do I round a number? contributed by ryanus
I would use Math::Round. It is easy to use. For example:
use Math::Round;
print nearest(.01, 1.555);
prints '1.56'.
 Answer: How do I round a number? contributed by fundflow The guy asked to round a number, the simplest way
is (my highschool teacher would be proud now..):
$rounded = int ( $orig + 0.5 )
This approach floors any decimal portion less than 0.5, and rounds up (in value) any decimal portion greater than .5. That means the following:
1.1 rounds to 1.0.
1.5 rounds to 2.0.
1.1 rounds to 1.0.
1.5 rounds to 1.0.
 Answer: How do I round a number? contributed by buckaduck For scientific applications requiring the use of significant
figures ("sig figs"), I strongly recommend the
Math::SigFigs module. Unfortunately, the
CPAN testers still haven't cleared it for Windows
clients, though...
use Math::SigFigs;
print FormatSigFigs($number, $digits);
 Answer: How do I round a number? contributed by jlistf POSIX probably has an appropriate routine that'll do just that. You could also try using sprintf with the appropriate %0.2f (or whatever precision you're looking for). finally (TMTOWTDI), you could use the int keyword to truncate it, which might be more effective. for example, to generate dice rolls:
int( rand 6 ) +1;
 Answer: How do I round a number? contributed by japhy Different rounding schema:
# 1.1 => 1; 1.9 => 1; 1.1 => 2; 1.9 => 2
$rounded = POSIX::floor($value);
# 1.1 => 2; 1.9 => 2; 1.1 => 1; 1.9 => 1
$rounded = POSIX::ceil($value);
# 1.1 => 1; 1.9 => 2; 1.1 => 1; 1.9 => 2
$rounded = round($value);
sub round {
$_[0] > 0 ? int($_[0] + .5) : int($_[0] + .5)
}
 Answer: How do I round a number? contributed by powerman Here shown all roundlike functions which exists in perl:
#!/usr/bin/perl
use POSIX;
@a=(3.3, 3.5, 3.7, 3.3, 3.5, 3.7, 3.45);
print "number\tint\tprintf\tfloor\tceil\n";
printf "%.2f\t%.1f\t%.1f\t%.2f\t%.2f\n",
$_,
int,
$_,
floor($_),
ceil($_)
foreach (@a);
This code produce this output:
number int printf floor ceil
3.30 3.0 3.3 3.00 4.00
3.50 3.0 3.5 3.00 4.00
3.70 3.0 3.7 3.00 4.00
3.30 3.0 3.3 4.00 3.00
3.50 3.0 3.5 4.00 3.00
3.70 3.0 3.7 4.00 3.00
3.45 3.0 3.5 3.00 4.00
 Answer: How do I round a number? contributed by 5mi11er I was looking for a ceil(x,y) function similar to what exists in excel, where x is the thing to round, and y is "significance" according to Excel v9 (Office 2000), I prefer to think of it as "interval".
But, I was also intrigued by several of the other answers given (found via supersearch), and then in a fit of playing around, I created several variations below.
My personal restrictions were to use math operations, and not rely on other modules. This eliminated the printf and POSIX answers.
use strict;
use warnings;
########
# This version takes two arguments
# The number to round
# And the number of places to the right or left of the decimal poin
+t
# Positive numbers to the left, negative numbers to the right.
# Think powers of 10.
#
# Parts of this were stolen from nodeid=8781, and nodeid=1873
# most notably from Roy Johnson and wrvhage
########
sub round {
my ($number, $places) = @_;
my $sign = ($number < 0) ? '' : '';
my $abs = abs($number);
if($places < 0) {
$places *= 1;
return $sign . substr($abs+("0." . "0" x $places . "5"),
0, $places+length(int($abs))+1);
} else {
my $p10 = 10**$places;
return $sign . int($abs/$p10 + 0.5)*$p10;
}
}
########
# Simple Ceiling function
########
sub ceil {
my ($num) = @_;
return int($num) + ($num > int($num));
}
########
# Function modeled after Excel's two argument function
# Number to act on
# Interval to return (2 would return only multiples of 2, 3 multipl
+es of 3 etc)
########
sub ceil_xl {
my ($num,$interval) = @_;
return ceil($num / $interval) * $interval;
}
########
# Function derived from node_id=270920
# Returns next nearest mulitple of 5 up to 50, then nearest 25 up t
+o 100,
# then nearest quarter of current power of 10.
########
sub ceil_qtrs {
my ($num) = @_;
my $abs=int(abs($num));
my $interval;
# This next line was the originally given answer from AbigailII,
# it was obtuse enough that I needed to break it down to fully unders
+tand it,
# then I wanted to modify it, and I then left my version in the more
+readable
# style.
# my $frac = $num < 100 ? 5 : (1 . ("0" x (length ($num)  1))) /
+ 4;
if($abs < 40) {
$interval = 5;
} elsif($abs < 100) {
$interval = 25;
} else {
$interval = "1".("0"x(length($abs)1));
$interval = $interval/4;
}
return ceil($num / $interval) * $interval;
}
my @data = qw(1 2 3.14159 4.634 5 5.165 6 9 10 10.257 13 23 89 99 100
+101 214 702 1328
1 2 3.14159 4.634 5 5.165 6 9 10 10.257 13 23 89 99 
+100 101 214 704 1328
);
my $format = " "."%13.13s "x8 . "\n";
printf ($format, "number","ceil_qtrs","ceil_xl(x,3)","ceil_xl(x,8)","c
+eil(x)","round(x,0)","round(x,1)","round(x,2)");
foreach (@data) {
printf ("%13.13s ",$_);
printf ("%13d ",ceil_qtrs($_));
printf ("%13d ",ceil_xl($_,3));
printf ("%13d ",ceil_xl($_,8));
printf ("%13d ",ceil($_));
printf ("%13d ",round($_,0));
printf ("%13d ",round($_,1));
printf ("%13.3f ",round($_,2));
print "\n";
}
 Answer: How do I round a number? contributed by Mago If you are using integers, and want to use Math::BigInt:
Math::BigInt  Arbitrary size integer math package
DESCRIPTION
All operators (inlcuding basic math operations) are overloaded if you declare your big integers as
$i = new Math::BigInt '123_456_789_123_456_789';
(snip)
METHODS
round
$x>round($A,$P,$round_mode); # round to accuracy or precision using
+ mode $r
 Answer: How do I round a number? contributed by Nimster How about
Use integer;
$thevalue*=1;
Seems the simplest, IMHO.
It rounds everything down, btw  so it acts kinda like 'div' in PASCAL. That's where it's useful. For rounding to the nearest, use any of the above. 
Please (register and) log in if you wish to add an answer
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
 a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)

For: 

Use: 
 &   & 
 <   < 
 >   > 
 [   [ 
 ]   ] 
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.

