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 (Java Language Specification) 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 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 (A Programming Language) 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.
division
division
|
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;
Every nth
Let’s say you wanted to do something every fourth
line, e.g. insert a blank, a coloured bar, a tick…
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 (Institute of Electrical & Electronics Engineers) 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