Bryan Denny
Bryan Denny

Reputation: 27596

How should I do integer division in Perl?

What is a good way to always do integer division in Perl?

For example, I want:

real / int = int

int / real = int

int / int = int

Upvotes: 66

Views: 129151

Answers (7)

Michael Ratanapintha
Michael Ratanapintha

Reputation: 40637

There are at least 2 reasonable answers to this question. (I originally gave only answer 2.)

  1. 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

  2. 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

Upvotes: 94

johannesvalks
johannesvalks

Reputation: 101

Integer division $x divided by $y ...

$z = -1 & $x / $y

How does it work?

$x / $y

return the floating point division

&

perform a bit-wise AND

-1

stands for

&HFFFFFFFF

for the largest integer ... whence

$z = -1 & $x / $y

gives the integer division ...

Upvotes: 0

Znik
Znik

Reputation: 1146

you can:

use integer;

it is explained by Michael Ratanapintha or else use manually:

$a=3.7;
$b=2.1;

$c=int(int($a)/int($b));

notice, 'int' is not casting. this is function for converting number to integer form. this is because Perl 5 does not have separate integer division. exception is when you 'use integer'. Then you will lose real division.

Upvotes: 5

Bryan Denny
Bryan Denny

Reputation: 27596

You can cast ints in Perl:

int(5/1.5) = 3;

Upvotes: 52

Steve Schaefer
Steve Schaefer

Reputation: 81

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.

Upvotes: 8

Manoj Kumar
Manoj Kumar

Reputation: 9

Hope it works

int(9/4) = 2.

Thanks Manojkumar

Upvotes: 0

Paul
Paul

Reputation: 1

Eg 9 / 4 = 2.25

int(9) / int(4) = 2

9 / 4 - remainder / deniminator = 2

9 /4 - 9 % 4 / 4 = 2

Upvotes: -2

Related Questions