In Java you take the remainder with the %
operator. % is informally called the modulus
operator, (sometimes called mod or modulo) though
mathematicians and serious computer scientists would beg to differ, it is a remainder
operator not a modulus. The JLS correctly
refers to it as a remainder operator.
Happily, Java division has the Euclidean property
namely when you multiply the quotient by the divisor and add the remainder you
get back to the dividend. When you ask for % 3 in
Java, you may be astounded to sometimes get an answer outside the range 0..2.
See remainder/modulus sign rules. Be especially careful
when corralling random numbers into a smaller range with the %
operator.
Negative Operands
Java’s modulus behaves, well, strangely. In Java, the sign of the
remainder follows the dividend, not the divisor as you would expect. %
can produce a negative result even with a positive divisor. Be especially
careful when corralling random numbers into a smaller range with the modulus
operator, e.g. wheel.nextInt()
% 3 will give you numbers -2
.. +2 not 0 .. 2 as most would expect.
For example, when you do a day of week calculation by taking day_number
% 7 in Java, you will be astounded to
sometimes get a negative answer outside the range 0 .. 6,
namely when the dividend is negative. See sign rules.
Java division is truncated division.
Mixed Base Calculations
The modulus operator is useful in time calculation. E.g. how many days, hours,
minutes, seconds, milliseconds is 112,233,445,566,778,899 milliseconds?
Going the other way from days, hours, minutes and seconds to milliseconds is
easier. You just multiply each component by the appropriate factor:
static final long MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000L;
static final long MILLISECONDS_PER_HOUR = 60 * 60 * 1000L;
static final long MILLISECONDS_PER_MINUTE = 60 * 1000L;
static final long MILLISECONDS_PER_SECOND = 1000L;
long millis = days * MILLISECONDS_PER_DAY + hours * MILLISECONDS_PER_HOUR
+ minutes * MILLISECONDS_PER_MINUTE
+ seconds * MILLISECONDS_PER_SECOND
+ milliseconds;
This is a rather simplistic answer to the problem. For more complicated answers
see Calendar.
You can use similar logic to deal with other goofy mixed base systems like
latitude and longitude with its degrees, minutes and seconds, yards, feet and
inches or tons, pounds and ounces. APL has built-in operators to neatly handle
these. In Java you have to code the conversions out longhand.
Sign Rules
Remainder, modulus and division are often defined in a quirky way in computer
languages, often to make it quick and easy to implement on the author’s
hardware. Java has %, the remainder operator, but
does not have a built-in modulus operator or function.
| Signs |
Division / |
Remainder % |
Modulus |
| + + |
7 / 4 = 1 |
7 % 4 = 3 |
7 mod 4 = 3 |
| - + |
-7 / 4 = -1 |
-7 % 4 = -3 |
-7 mod 4 = 1 |
| + - |
7 / -4 = -1 |
7 % -4 = 3 |
7 mod -4 = -1 |
| - - |
-7 / -4 = +1 |
-7 % -4 = -3 |
-7 mod -4 = -3 |
Honing Your Intuition
By examining the patterns in the following three tables of Java remainder %,
mod mathematical modulus and /
integer division, you will have a better intuition of how they work. Note how
for Java %, the sign of the divisor is irrelevant. The sign of the result
follows the sign of the dividend. Note for mathematical modulus, the result is
always in the range 0..divisor-1 for positive divisors, irrespective of the sign
of the dividend, and the result is always in the range divisor+1..0 for negative
divisors, irrespective of the sign of the dividend. % and modulus give the same
results when the signs of dividend and divisor match. It is interesting to note
how complex the symmetries and repetitions are.
|
Integer Division: col / row |
|
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| -10 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-10 |
| -9 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-9 |
| -8 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-1 |
-8 |
| -7 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-1 |
-1 |
-7 |
| -6 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-1 |
-1 |
-1 |
-6 |
| -5 |
2 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-1 |
-1 |
-1 |
-2 |
-5 |
| -4 |
2 |
2 |
2 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-1 |
-1 |
-2 |
-2 |
-2 |
-4 |
| -3 |
3 |
3 |
2 |
2 |
2 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-1 |
-2 |
-2 |
-2 |
-3 |
-3 |
-3 |
| -2 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
-1 |
-1 |
-2 |
-2 |
-3 |
-3 |
-4 |
-4 |
-5 |
-2 |
| -1 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
-1 |
-2 |
-3 |
-4 |
-5 |
-6 |
-7 |
-8 |
-9 |
-10 |
-1 |
| 0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
| 1 |
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
1 |
| 2 |
-5 |
-4 |
-4 |
-3 |
-3 |
-2 |
-2 |
-1 |
-1 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
2 |
| 3 |
-3 |
-3 |
-2 |
-2 |
-2 |
-1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
3 |
| 4 |
-2 |
-2 |
-2 |
-1 |
-1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
4 |
| 5 |
-2 |
-1 |
-1 |
-1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
2 |
5 |
| 6 |
-1 |
-1 |
-1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
6 |
| 7 |
-1 |
-1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
7 |
| 8 |
-1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
8 |
| 9 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
9 |
| 10 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
10 |
|
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|---|
|
|
Java Remainder: col % row == col - row * ( col / row ) |
|
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| -10 |
0 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
-10 |
| -9 |
-1 |
0 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
0 |
1 |
-9 |
| -8 |
-2 |
-1 |
0 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0 |
1 |
2 |
-8 |
| -7 |
-3 |
-2 |
-1 |
0 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
1 |
2 |
3 |
-7 |
| -6 |
-4 |
-3 |
-2 |
-1 |
0 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
0 |
1 |
2 |
3 |
4 |
-6 |
| -5 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
4 |
0 |
-5 |
| -4 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
-4 |
| -3 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
-3 |
| -2 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
-2 |
| -1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
| 0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
| 1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
| 2 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
2 |
| 3 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
3 |
| 4 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
4 |
| 5 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
4 |
0 |
5 |
| 6 |
-4 |
-3 |
-2 |
-1 |
0 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
0 |
1 |
2 |
3 |
4 |
6 |
| 7 |
-3 |
-2 |
-1 |
0 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
1 |
2 |
3 |
7 |
| 8 |
-2 |
-1 |
0 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0 |
1 |
2 |
8 |
| 9 |
-1 |
0 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
0 |
1 |
9 |
| 10 |
0 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
10 |
|
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|---|
|
|
Mathematical Modulus: col mod row == (col % row + row) % row |
|
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| -10 |
0 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-10 |
| -9 |
-1 |
0 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-8 |
-9 |
| -8 |
-2 |
-1 |
0 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-7 |
-6 |
-8 |
| -7 |
-3 |
-2 |
-1 |
0 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-6 |
-5 |
-4 |
-7 |
| -6 |
-4 |
-3 |
-2 |
-1 |
0 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
-5 |
-4 |
-3 |
-2 |
-6 |
| -5 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
-4 |
-3 |
-2 |
-1 |
0 |
-5 |
| -4 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
-3 |
-2 |
-1 |
0 |
-3 |
-2 |
-4 |
| -3 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-1 |
0 |
-2 |
-3 |
| -2 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-2 |
| -1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
| 0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
| 1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
| 2 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
2 |
| 3 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
3 |
| 4 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
4 |
| 5 |
0 |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
4 |
0 |
5 |
| 6 |
2 |
3 |
4 |
5 |
0 |
1 |
2 |
3 |
4 |
5 |
0 |
1 |
2 |
3 |
4 |
5 |
0 |
1 |
2 |
3 |
4 |
6 |
| 7 |
4 |
5 |
6 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
1 |
2 |
3 |
7 |
| 8 |
6 |
7 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0 |
1 |
2 |
8 |
| 9 |
8 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
0 |
1 |
9 |
| 10 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
10 |
|
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|---|
|
Getting the digits of a Number, any Radix
Modulus can be used to take a number apart into digits, decimal, hexadecimal or
any other base.
Even or Odd?
You can tell if an int is even or odd by looking at
its remainder, modulus 2:
boolean even = x % 2 == 0;
boolean odd = x % 2 != 0;
Note this similar code you often see posted will not work for negative
numbers:
boolean even = x % 2 == 0;
boolean odd = x % 2 == 1;
There is a faster way to compute these, by masking off the low order bit:
boolean even = ( x & 1 ) == 0;
boolean odd = ( x & 1 ) != 0;
The code can be even faster if you want a number 0 or 1 as the result, say for
indexing an array, instead of a boolean:
int odd = x & 1;
Other Uses
Modulus can be used in computing the next free circular squirrel cage buffer.
int nextbuf = ( thisbuf + 1 ) % supply;
Modulus can be used to turn an offset into a file into a chunk number and offset
within that chunk.
int recordNumber = fileOffset / blockSize;
int recordOffset = fileOffset % blockSize;
Floating Point %
% is also defined to work with float and double
operands, though that use is quite rare.
The result of a floating-point remainder operation as computed by the %
operator is not the same as that produced by the remainder operation defined by
the IEEE 754 floating point standard. The IEEE 754
remainder operation computes the remainder from a rounding division, not a
truncating division. % on floating-point
operations behaves analogously to the integer remainder operator; this may be
compared with the C library function fmod. The IEEE
754 remainder operation may be computed by the library routine Math.
IEEEremainder. (Note the violation of the
naming conventions.)
Learning More