Как найти остаток числа java

Я уже однажды расписывал операции в Java. В этой статье я акцентрирую внимание на операцию взятия остатка от деления, так как её работа отличается в различных языках программирования и иногда порождает недопонимание.

Операция взятия остатка 
% в Java работает не только с целыми числами, но и с числами с плавающей точкой.

Для целых чисел операция взятия остатка работает по такому принципу, что результат операции будет таким, что будет выполняться равенство:

(a / b) * b + (a % b) == a

Это равенство действует даже в том случае, если левый операнд будет наименьшим отрицательным числом для своего типа, а операнд в правой части будет равен -1 (тогда результатом будет 0).

Результатом операции взятия остатка для целых чисел в Java может быть отрицательное число только в том случае, если левый операнд будет отрицательным числом, а также результат может быть положительным только в том случае, если операнд в левой части будет положительным числом.

Если в правой части операции взятия остатка для целочисленных операндов в Java стоит 0, то результатом будет
ArithmeticException.

Примеры работы операции взятия остатка для целочисленных операндов (выполнено в JShell):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

$ ./jshell

|  Welcome to JShell Version 10.0.1

|  For an introduction type: /help intro

jshell> 5 % 3

$1 ==> 2

jshell> 5 / 3

$2 ==> 1

jshell> 5 % (3)

$3 ==> 2

jshell> 5 / (3)

$4 ==> 1

jshell> (5) % 3

$5 ==> 2

jshell> (5) / 3

$6 ==> 1

jshell> (5) % (3)

$7 ==> 2

jshell> (5) / (3)

$8 ==> 1

Как я уже говорил, в Java операция взятия остатка
% работает и с числами с плавающей точкой (
float и
double). Согласно спецификации языка Java операция взятия остатка для чисел с плавающей точкой работает не так, как это принято в IEEE 754, но если очень нужно то можно использовать метод
Math.IEEEremainder.

В Java операция взятия остатка
% работает согласно следующим правилам:

  • Если один из операндов равен NaN, то результат операции будет NaN.
  • Если результат не NaN, то знаком результата будет знак операнда в левой части.
  • Если операнд в левой части Infinity, или операнд в правой части равен нулю, или выполняются оба условия, то результат будет равен операнду в левой части.
  • Если операнд в левой части конечен, а операнд в правой части Infinity, то результат будет равен операнду в левой части.
  • Если операнд в левой части равен нулю, а операнд в правой части конечен, то результат будет равен операнду в левой части.
  • Во всех остальных случаях результат
    r взятия остатка от операнда
    n при делении на
    d определяется по математической формуле r = n — (d × q), где q будет целым числом, которое отрицательно только в случае, если n / d отрицательно, и положительно, если  n / d положительно, и его размер максимально возможный, но не превышающий  отношение n и d. Пример: 0,5 ÷ 0,3 = 1,6, тогда q будет положительным, так как 1,6 положительно, а наибольший размер, не превышающий 1,6 будет 1, то q = 1, а значит r = 0,5 — (0,3 × 1) = 0,2.

Операция взятия остатка для чисел с плавающей точкой никогда не приводит к возникновению Exception-ов.

Примеры операции взятия остатка для чисел с плавающей точкой:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

$ ./jshell

|  Welcome to JShell Version 10.0.1

|  For an introduction type: /help intro

jshell> Double.NaN % 3.0

$1 ==> NaN

jshell> 5.0 % Double.NaN

$2 ==> NaN

jshell> Double.NaN % Double.NaN

$3 ==> NaN

jshell> Double.POSITIVE_INFINITY % 0.0

$4 ==> NaN

jshell> 5.0 % Double.POSITIVE_INFINITY

$5 ==> 5.0

jshell> 5.0 % Double.NEGATIVE_INFINITY

$6 ==> 5.0

jshell> 0.0 % 3.0

$7 ==> 0.0

jshell> 0.0 % 3.0

$8 ==> 0.0

jshell> 5.0 % 3.0

$9 ==> 2.0

jshell> 5.0 % (3.0)

$10 ==> 2.0

jshell> (5.0) % 3.0

$11 ==> 2.0

jshell> (5.0) % (3.0)

$12 ==> 2.0

jshell> 5.1 % 3.2

$13 ==> 1.8999999999999995

jshell> 5.12 % 3.4

$14 ==> 1.7200000000000002

Имейте в виду, что в других языках операция взятия остатка может работать по-другому. В этой статье описана работа операции взятия остатка 
% для языка Java.

Since everyone else already gave the answer, I’ll add a bit of additional context. % the «modulus» operator is actually performing the remainder operation. The difference between mod and rem is subtle, but important.

(-1 mod 2) would normally give 1. More specifically given two integers, X and Y, the operation (X mod Y) tends to return a value in the range [0, Y). Said differently, the modulus of X and Y is always greater than or equal to zero, and less than Y.

Performing the same operation with the «%» or rem operator maintains the sign of the X value. If X is negative you get a result in the range (-Y, 0]. If X is positive you get a result in the range [0, Y).

Often this subtle distinction doesn’t matter. Going back to your code question, though, there are multiple ways of solving for «evenness».

The first approach is good for beginners, because it is especially verbose.

// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
  isEven = true
}
else
{
  isEven = false
}

The second approach takes better advantage of the language, and leads to more succinct code. (Don’t forget that the == operator returns a boolean.)

// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);

The third approach is here for completeness, and uses the ternary operator. Although the ternary operator is often very useful, in this case I consider the second approach superior.

// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;

The fourth and final approach is to use knowledge of the binary representation of integers. If the least significant bit is 0 then the number is even. This can be checked using the bitwise-and operator (&). While this approach is the fastest (you are doing simple bit masking instead of division), it is perhaps a little advanced/complicated for a beginner.

// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);

Here I used the bitwise-and operator, and represented it in the succinct form shown in option 2. Rewriting it in Option 1’s form (and alternatively Option 3’s) is left as an exercise to the reader. ;)

Остаток от деления — это целое число, полученное в результате операции деления с остатком. Если остаток от деления равен, то число делится на делитель нацело. В Java остаток от деления одного числа на другое можно получить при помощи оператора %

System.out.println(3 % 2); // => 1
System.out.println(4 % 2); // => 0

Рассмотрим работу оператора на примере. Поделим число 78 на 33. При делении мы получим неполное частное 2 и остаток от деления. Чтобы убедиться в правильности результата, нужно неполное частное умножить на делитель и прибавить остаток от деления:

33 * 2 + 12 = 78

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    The remainder is the integer left over after dividing one integer by another. The quotient is the quantity produced by the division of two numbers. For example,

    (7/2) = 3 In the above expression 7 is divided by 2, so the quotient is 3 and the remainder is 1.

    Approach:

    Divide the dividend by the divisor using / operator. Both dividend and divisor can be of any type except string, the result will also be computed accordingly. Get the remainder using % operator. Expressions used in program to calculate quotient and remainder:

    quotient = dividend / divisor;
    remainder = dividend % divisor;

    Note: The program will throw an ArithmeticException: / by zero when divided by 0. 

    Explanation:

    Consider Dividend = 100 and Divisor = 6 Therefore, Quotient = 100/6 = 16 Remainder = 100%6 = 4

    Below are programs that illustrate the above approach: 

    Program 1: 

    java

    public class QuotientAndRemainder {

        public static void main(String[] args)

        {

            int dividend = 556, divisor = 9;

            int quotient = dividend / divisor;

            int remainder = dividend % divisor;

            System.out.println("The Quotient is = " + quotient);

            System.out.println("The Remainder is = " + remainder);

        }

    }

    Output:

    The Quotient is = 61
    The Remainder is = 7

    Time Complexity: O(1)

    Auxiliary Space: O(1)

    Program 2: For a negative number. 

    java

    public class QuotientAndRemainder {

        public static void main(String[] args)

        {

            int dividend = -756, divisor = 8;

            int quotient = dividend / divisor;

            int remainder = dividend % divisor;

            System.out.println("The Quotient is = " + quotient);

            System.out.println("The Remainder is = " + remainder);

        }

    }

    Output:

    The Quotient is = -94
    The Remainder is = -4

    Time Complexity: O(1)

    Auxiliary Space: O(1)

    Program 3: This program will throw an ArithmeticException as the divisor = 0. 

    java

    public class QuotientAndRemainder {

        public static void main(String[] args)

        {

            int dividend = 56, divisor = 0;

            int quotient = dividend / divisor;

            int remainder = dividend % divisor;

            System.out.println(" The Quotient is = "

                               + quotient);

            System.out.println(" The Remainder is = "

                               + remainder);

        }

    }

    Output:

    Exception in thread "main" java.lang.ArithmeticException: / by zero
        at QuotientAndRemainder.main(QuotientAndRemainder.java:7)

    Time Complexity: O(1)

    Auxiliary Space: O(1)

    Last Updated :
    13 Mar, 2023

    Like Article

    Save Article

    Арифметические операции

    Последнее обновление: 30.10.2018

    Большинство операций в Java аналогичны тем, которые применяются в других си-подобных языках. Есть унарные операции (выполняются над одним операндом),
    бинарные — над двумя операндами, а также тернарные — выполняются над тремя операндами. Операндом является переменная или значение (например, число),
    участвующее в операции. Рассмотрим все виды операций.

    В арифметических операциях участвуют числа. В Java есть бинарные арифметические операции (производятся над двумя операндами) и унарные (выполняются над одним операндом). К бинарным операциям относят
    следующие:

    • +

      операция сложения двух чисел:

      int a = 10;
      int b = 7;
      int c = a + b;  // 17
      int d = 4 + b;  // 11
      
    • -

      операция вычитания двух чисел:

      int a = 10;
      int b = 7;
      int c = a - b;  // 3
      int d = 4 - a;  // -6
      
    • *

      операция умножения двух чисел

      int a = 10;
      int b = 7;
      int c = a * b;  // 70
      int d = b * 5;  // 35
      
    • /

      операция деления двух чисел:

      int a = 20;
      int b = 5;
      int c = a / b;  // 4
      double d = 22.5 / 4.5;  // 5.0
      

      При делении стоит учитывать, что если в операции участвуют два целых числа, то результат деления будет округляться до целого числа, даже если
      результат присваивается переменной float или double:

      double k = 10 / 4;     // 2
      System.out.println(k);
      

      Чтобы результат представлял число с плавающей точкой, один из операндов также должен представлять число с плавающей точкой:

      double k = 10.0 / 4;     // 2.5
      System.out.println(k);
      
    • %

      получение остатка от деления двух чисел:

      int a = 33;
      int b = 5;
      int c = a % b;  // 3
      int d = 22 % 4; // 2 (22 - 4*5 = 2)
      

    Также есть две унарные арифметические операции, которые производятся над одним числом: ++ (инкремент) и — (декремент). Каждая из операций имеет две разновидности: префиксная и постфиксная:

    • ++ (префиксный инкремент)

      Предполагает увеличение переменной на единицу, например, z=++y (вначале значение переменной y увеличивается на 1,
      а затем ее значение присваивается переменной z)

      int a = 8;
      int b = ++a;
      System.out.println(a);	// 9
      System.out.println(b);	// 9
      
    • ++ (постфиксный инкремент)

      Также представляет увеличение переменной на единицу, например, z=y++ (вначале значение переменной y присваивается
      переменной z, а потом значение переменной y увеличивается на 1)

      int a = 8;
      int b = a++;
      System.out.println(a);	// 9
      System.out.println(b);	// 8
      
    • -- (префиксный декремент)

      уменьшение переменной на единицу, например, z=--y (вначале значение переменной y уменьшается на 1,
      а потом ее значение присваивается переменной z)

      int a = 8;
      int b = --a;
      System.out.println(a);	// 7
      System.out.println(b);	// 7
      
    • -- (постфиксный декремент)

      z=y-- (сначала значение переменной y присваивается переменной z, а затем значение переменной y уменьшается на 1)

      int a = 8;
      int b = a--;
      System.out.println(a);	// 7
      System.out.println(b);	// 8
      

    Приоритет арифметических операций

    Одни операции имеют больший приоритет, чем другие, и поэтому выполняются вначале. Операции в порядке уменьшения приоритета:

    ++ (постфиксный инкремент), — (постфиксный декремент)

    ++ (префиксный инкремент), — (префиксный декремент)

    * (умножение), / (деление), % (остаток от деления)

    + (сложение), — (вычитание)

    Приоритет операций следует учитывать при выполнении набора арифметических выражений:

    int a = 8;
    int b = 7;
    int c = a + 5 * ++b;      
    System.out.println(c);	// 48
    

    Вначале будет выполняться операция инкремента ++b, которая имеет больший приоритет — она увеличит значение переменной b и возвратит его в
    качестве результата. Затем выполняется умножение 5 * ++b, и только в последнюю очередь выполняется сложение a + 5 * ++b

    Скобки позволяют переопределить порядок вычислений:

    int a = 8;
    int b = 7;
    int c = (a + 5) * ++b;    
    System.out.println(c);	// 104
    

    Несмотря на то, что операция сложения имеет меньший приоритет, но вначале будет выполняться именно сложение, а не умножение, так как операция сложения заключена в скобки.

    Ассоциативность операций

    Кроме приоритета операции отличаются таким понятием как
    ассоциативность. Когда операции имеют один и тот же приоритет, порядок вычисления определяется
    ассоциативностью операторов. В зависимости от ассоциативности есть два типа операторов:

    • Левоассоциативные операторы, которые выполняются слева направо

    • Правоассоциативные операторы, которые выполняются справа налево

    Так, некоторые операции, например, операции умножения и деления, имеют один и тот же приоритет. Какой же тогда будет результат в выражении:

    int x = 10 / 5 * 2;

    Стоит нам трактовать это выражение как (10 / 5) * 2 или как 10 / (5 * 2)? Ведь в зависимости от трактовки мы получим разные результаты.

    Все арифметические операторы (кроме префиксного инкремента и декремента) являются левоассоциативными, то есть выполняются слева направо. Поэтому выражение 10 / 5 * 2 необходимо трактовать как (10 / 5) * 2,
    то есть результатом будет 4.

    Операции с числами с плавающей точкой

    Следует отметить, что числа с плавающей точкой не подходят для финансовых и других вычислений, где ошибки при округлении могут быть критичными. Например:

    double d = 2.0 - 1.1;
    System.out.println(d);
    

    В данном случае переменная d будет равна не 0.9, как можно было бы изначально предположить, а 0.8999999999999999.
    Подобные ошибки точности возникают из-за того, что на низком уровне для представления чисел с плавающей точкой применяется
    двоичная система, однако для числа 0.1 не существует двоичного представления, также как и для других дробных значений.
    Поэтому в таких случаях обычно применяется класс BigDecimal, который позволяет обойти подобные ситуации.

    Понравилась статья? Поделить с друзьями:
  • Как найти трудовую инспекцию по адресу
  • Как найти клип не ангелы
  • Как найти телефон ксиаоми если потерял
  • Как найти сумму бесконечной геометрической прогрессии формула
  • Как найти точку если известно растояние