How should I do integer division in Perl?
There are at least 2 reasonable answers to this question. (I originally gave only answer 2.)
-
Use the
int()
function to truncate the floating-point calculation result to an integer (throwing away the decimal part), as Bryan suggested in his self-answer: #539805 -
Use the
use integer
pragma to make Perl truncate both the inputs and results of calculations to integers. It's scoped to within{ }
blocks.
Examples:
print 3.0/2.1 . "\n"; # => 1.42857142857143
print 5.0/1.5 . "\n"; # => 3.33333333333333
print int(3.0/2.1) . "\n"; # => 1
print int(5.0/1.5) . "\n"; # => 3
{
use integer;
print 3.0/2.1 . "\n"; # => 1
print 5.0/1.5 . "\n"; # => 5 (because 1.5 was truncated to 1)
}
print 3.0/2.1 . "\n"; # => 1.42857142857143 again
You can cast ints in Perl:
int(5/1.5) = 3;
int(x+.5)
will round positive values toward the nearest integer. Rounding up is harder.
To round toward zero:
int($x)
For the solutions below, include the following statement:
use POSIX;
To round down: POSIX::floor($x)
To round up: POSIX::ceil($x)
To round away from zero: POSIX::floor($x) - int($x) + POSIX::ceil($x)
To round off to the nearest integer: POSIX::floor($x+.5)
Note that int($x+.5)
fails badly for negative values. int(-2.1+.5)
is int(-1.6)
, which is -1.