# Rounding up in perl

#### Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

•  Subject
• Author
• Posted on

Is there more than one function for rounding a
number up in perl?
I tried the ceil() function but get an undefined subroutine
message.

## Re: Rounding up in perl

See
perldoc -q round
"Does Perl have a round() function?  What about ceil() and floor()?"

jue

## Re: Rounding up in perl

For rounding - yes. For rounding up - no.

You forgot "use POSIX"?

hp

## Re: Rounding up in perl

David Groff wrote:

Simply add 0.5 to the number and round, or convert to an integer then

Marshall

jue

## Re: Rounding up in perl

Marshall Dudley wrote:

Neither of these methods is bullet proof. Accuracy of the results will
depend on the number and/or the method used to do the rounding.

use strict;
use warnings;

while (my \$i = <DATA>)
{
chomp \$i;
my \$j = \$i + 1;
my \$k = \$i + 0.5;
print "\$i rounds to ", sprintf('%d', \$j), ' or ', sprintf('%.0f', \$k),
"\n";
}

__DATA__
2
3

----

2 rounds to 3 or 2
3 rounds to 4 or 4

## Re: Rounding up in perl

Here is a Perl ceil/floor equivalent. The first code section
seems to correctly implement floor by taking into account that
int() does not use the sign in its process of rounding. The
second code section with floor, although intuitive is not correct.
For a full proof, all the values between 2.0 - 2.9 should be checked.

sln

# ===========================================
# Correct ceil/floor equavelent
# when rounding.
# - - - - - - - -
use strict;
use warnings;

printf( "The floor of 2.8 is %f\n", _floor( 2.8 ) );
printf( "The floor of -2.8 is %f\n", _floor( -2.8 ) );

printf( "The ceil of 2.8 is %f\n", _ceil( 2.8 ) );
printf( "The ceil of -2.8 is %f\n", _ceil( -2.8 ) );

sub _ceil {return int(shift()+.5)}

sub _floor {my \$y = shift(); return int((\$y < 0) ? \$y-.5 : \$y)}

__END__

The floor of 2.8 is 2.000000
The floor of -2.8 is -3.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000

# ===========================================
# Correct ceil equavelent, incorrect floor
# Int() rounds down the Absolute value.
# So do not use this floor.
# - - - - - - - -
use strict;
use warnings;

printf( "The floor of 2.8 is %f\n", _floor( 2.8 ) );
printf( "The floor of -2.8 is %f\n", _floor( -2.8 ) );

printf( "The ceil of 2.8 is %f\n", _ceil( 2.8 ) );
printf( "The ceil of -2.8 is %f\n", _ceil( -2.8 ) );

sub _ceil {return int(shift()+.5)}

sub _floor {return int(shift())}

__END__

The floor of 2.8 is 2.000000
The floor of -2.8 is -2.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000

==========================================
C - reference code

// crt_floor.c
// This example displays the largest integers
// less than or equal to the floating-point values 2.8
// and -2.8. It then shows the smallest integers greater
// than or equal to 2.8 and -2.8.

#include <math.h>
#include <stdio.h>

int main( void )
{
double y;

y = floor( 2.8 );
printf( "The floor of 2.8 is %f\n", y );
y = floor( -2.8 );
printf( "The floor of -2.8 is %f\n", y );

y = ceil( 2.8 );
printf( "The ceil of 2.8 is %f\n", y );
y = ceil( -2.8 );
printf( "The ceil of -2.8 is %f\n", y );
}

Output

The floor of 2.8 is 2.000000
The floor of -2.8 is -3.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000

## Re: Rounding up in perl

That is because int() does not *have* a process of rounding.

int() does not do rounding.

--
email: perl -le "print scalar reverse qq/moc.noitatibaher0cmdat/"

## Re: Rounding up in perl

Not only does int() round, but there is no way it can return
without rounding.

sln

perlfunc.html
===============================
Numeric functions

..., int, ...

int EXPR

int

Returns the integer portion of EXPR. If EXPR is omitted,
uses \$_. You should not use this function for rounding:
one because it truncates towards 0, and two because machine
representations of floating point numbers can sometimes
produce counterintuitive results.

## Re: Rounding up in perl

wrote:

>> That is because int() does not *have* a process of rounding.
>> int() does not do rounding.

s> Not only does int() round, but there is no way it can return
s> without rounding.

and you determined that from what text in the docs you quote?

s> perlfunc.html
s> ===============================
s> Numeric functions

s> ..., int, ...

s> int EXPR

s> int

s> Returns the integer portion of EXPR. If EXPR is omitted,
s> uses \$_. You should not use this function for rounding:
s> one because it truncates towards 0, and two because machine
s> representations of floating point numbers can sometimes
s> produce counterintuitive results.

and where does it say int() does rounding? it even says you should NOT
use it for rounding. truncation (which is what int() does) is not
rounding in any sense of the term rounding. your saying otherwise will
not make it so.

uri

--
Uri Guttman  ------  uri@stemsystems.com  --------  http://www.sysarch.com --
-----  Perl Code Review , Architecture, Development, Training, Support ------
--------- Free Perl Training --- http://perlhunter.com/college.html ---------
---------  Gourmet Hot Cocoa Mix  ----  http://bestfriendscocoa.com ---------

## Re: Rounding up in perl

It says it should not be used for rounding, for TWO reasons.
Thats two references to ROUNDING you say it doesen't use.

sln

## Re: Rounding up in perl

sln@netherlands.com wrote:

Or... it's that it could be used for rounding, but that it's not a good
idea, as you could have unexpected results.  I'm sure there are other
functions to misuse just as easily, if you prefer.
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting.  24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

## Re: Rounding up in perl

[snip]
And just what is that?

sln

## Re: Rounding up in perl

sln@netherlands.com wrote:

It might appear to be working fine and give you the desired/expected
results, but by the nature of it, and as you're warned about in the
docs you quoted yourself, it is not a good idea and probably won't work
how you expect it to.  I don't know what else to say?
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting.  24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

## Re: Rounding up in perl

It is certainty for you, you won't and can't depend on Perl intrinsic functions.
Because for you, they work intermittentely and with unexpected results.

I wish you luck.

sln

## Re: Rounding up in perl

sln@netherlands.com wrote:

I didn't create it, I didn't write the documentation about it.  While
I'm sure one could work with said function to do rounding, it's not
intended to round and suffers from side effects.  For the record, in
many, many years of coding in Perl, I've never had a single program
have unexpected results.  This is probably attributed to the fact that
I use the correct, intended functions for what they were designed for,
assuming I don't roll out my own.  Probably, ignoring the intent of a
function not being what you think it is, and the docs warning not to
use it for the purpose you want, is why you're so confused?  Don't take
that out on me.  Obviously, you _can_ use int() to round, but I doubt
it's going to work like you think.  You *do* know what truncation is,
right?
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting.  24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

## Re: Rounding up in perl

[snip]

Ah, just what is the intention of int()? And what are the 'side' effects?

sln

## Re: Rounding up in perl

sln@netherlands.com wrote:

Just what it says (Returns the integer portion of EXPR):

int EXPR
int     Returns the integer portion of EXPR.  If EXPR is omitted,
uses \$_.  You should not use this function for rounding: one because
it truncates towards 0, and two because machine representations
of floating point numbers can sometimes produce counterintu-
itive results.  For example, "int(-6.725/0.025)" produces -268
rather than the correct -269; thatâ€™s because itâ€™s really more
"sprintf", "printf", or the "POSIX::floor" and "POSIX::ceil"
functions will serve you better than will int()

I repeat, I didn't say you couldn't use it for rounding, but it's not
the best function for it, unless you are okay with results you probably
don't want now and then (which to me, says it's a bad idea -- which the
docs tell you as well).  By all means, if you want to use it for
rounding, go for it (and good luck with that).
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting.  24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

## Re: Rounding up in perl

[A complimentary Cc of this posting was sent to
Tim Greer

So do it.

int() rounds.  Period.

It is.

There is no side effects.

[But we had this discussion many times.  Perl docs are abyssmal...]

Hope this helps,
Ilya

## Re: Rounding up in perl

Ilya Zakharevich wrote:

Do what?  Go back in time and create it or go back in time and write the
documention?

Just not as well as other methods.

Just not accurately in every circumstance (where its own documentation
recommends against using it)

According to the documentation it does.

So rewrite the docs.
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting.  24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!