Результат целочисленного деления java

Результат целочисленного деления java

Большинство операций в 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
int a = 8; int b = a++; System.out.println(a); // 9 System.out.println(b); // 8
int a = 8; int b = --a; System.out.println(a); // 7 System.out.println(b); // 7
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

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

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

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

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

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

Стоит нам трактовать это выражение как (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, который позволяет обойти подобные ситуации.

Источник

Тип результата целочисленного деления

Не могу понять, почему IDE ругается.
Допустим, я инициализирую переменную с типом double и в нее кладу результат операции деления целых чисел:

int i = 200; double result = i / 2;

Я назначаю результату тип double с тем смыслом, что результат может получиться как целочисленным, так и нет. В зависимости от того, что будет в переменной i(например 199).

Почему IDE выделяет это предупреждением integer division in floating-point context ?

Вычислить остаток от целочисленного деления 13 в 5 степени на 24
13^5mod24 как пишется и какие библиотеки нужно добавить. И что бы для прим данных то есть на int.

Как определить корректность заданного возраста (Тип результата boolean)
Возраст может принимать значения в диапазоне от 1-120. Вводимые значения 25,0,120,121. Как бэ в.

В чем ошибка при выводе двух целых чисел,нахождения результата их деления и выводом результата на экран?
решил вывести с клавиатуры два целых числа,написал программу как написано в учебнике Фаронова В.В.

Для двух целых чисел найти остаток и частное от целочисленного деления, частное от вещественного деления
Уважаемые форумчане помогите пожалуйста с двумя программами. Это вопрос жизни и отчисления, я.

Эксперт Java

ЦитатаСообщение от xoraxax Посмотреть сообщение

Эксперт PythonЭксперт Java

ЦитатаСообщение от СергейСереб Посмотреть сообщение

На результат посмотри

Добавлено через 6 минут
int/int — это целочисленное деление, и результат его таки int . А ты его присваиваешь переменной типа double . Вот IDE тебе об этом и говорит.
А вот int/double — результат будет double , что целиком и полностью всех устраивает.

ЦитатаСообщение от iSmokeJC Посмотреть сообщение

Разве результатом 199/2 будет целое число?

Добавлено через 11 минут

ЦитатаСообщение от СергейСереб Посмотреть сообщение

Я так понимаю, что будет не целое число, но будет выполнено приведение к типу int и просто отбросится дробная часть, что не совсем корректно в боьшинстве случаев.
Т.е. Если в примере выше неизвестно какого типа число будет i, нужно его инициализировать как double(например), и в результате получится так же double без отбрасывания дробной части?

Эксперт PythonЭксперт Java

ЦитатаСообщение от СергейСереб Посмотреть сообщение

Будет именно ЦЕЛОЕ ЧИСЛО. Без всяких отбрасываний и приведений. Именно поэтому тебе сказали посмотреть на результат.
Понимаешь что значит «целочисленное деление»?

ЦитатаСообщение от iSmokeJC Посмотреть сообщение

Будет именно ЦЕЛОЕ ЧИСЛО. Без всяких отбрасываний и приведений. Именно поэтому тебе сказали посмотреть на результат.
Понимаешь что значит «целочисленное деление»?

При целочисленной арифметике результат деления одного целого числа на другое состоит из двух чисел — частного и остатка. Если остаток деления отбросить, получим результат, в абсолютной величине округленный до меньшего целого.

Эксперт PythonЭксперт Java

Добавлено через 1 минуту
Три болта надо поделить на двоих механиков. Каждому по одному. Один лишний. Именно так работает целочисленное деление. Никаких дробей, округлений и приведений.

ЦитатаСообщение от СергейСереб Посмотреть сообщение

При целочисленной арифметике результат деления одного целого числа на другое состоит из двух чисел — частного и остатка. Если остаток деления отбросить, получим результат, в абсолютной величине округленный до меньшего целого.

Здравствуйте.
Что касается математики: пусть a и b — целые числа, причем b не равно нулю. Для того, что-бы нацело разделить число a(делимое) на число b(делить), необходимо найти такие числа c и d, при которых будет выполняться равенство: a= b*c+d. В результате получим два числа: число с — неполное частное;
d — остаток от деления, при условии, что 0 <=d<|b|.
При целочисленном делении в математике различают два случая:
случай первый: b>0 (делитель больше нуля).

При b>0, неполное частное с = a / b, где результат округлен до первого целого в меньшую сторону.

ПРИМЕР: -5 / 2 => неполное частное -3, остаток d=a-b*c, т.е. 1.
5 / -2 => неполное частное -2, остаток 1.

public class FirstSample { public static void main(String[] args) { int a=-5; int b=2; int result=a/b; System.out.println(result); System.out.println(a % b); } }

Результат работы программы:
-2 (Математически должно быть -3!)
-1. (Математическое условие предъявляемое остатку не выполняется!)

Вывод: В языке Ява при делении int/int, тип результата будет int. Но само значение результата математически верным будет не всегда. Ровно как и результат операции modulo «mod», «%» не является математическим остатком от деления двух целых чисел! Важно знать!

Эксперт Java

ЦитатаСообщение от Improvizator Посмотреть сообщение

Что касается математики: пусть a и b — целые числа, причем b не равно нулю. Для того, что-бы нацело разделить число a(делимое) на число b(делить), необходимо найти такие числа c и d, при которых будет выполняться равенство: a= b*c+d. В результате получим два числа: число с — неполное частное;

ЦитатаСообщение от Improvizator Посмотреть сообщение

Результат работы программы:
-2 (Математически должно быть -3!)
-1. (Математическое условие предъявляемое остатку не выполняется!)

Не пойму, что тебя математически не устраивает.

ЦитатаСообщение от korvin_ Посмотреть сообщение

Из вашего выражения следует, что остаток от целочисленного деления равен (-1). Однако в математике понятие остатка от целочисленного деления довольно точно и однозначно определено! А именно: остатком от целочисленного деления двух целых чисел A и B (причем B не равно нулю) является целое число (в данном случае D), которое больше либо равно нулю и меньше делителя (в данном случае B) по модулю, и при котором выполняется равенство A=B*C+D. Из данного определения очевидно, что математический остаток от целочисленного деления двух целых чисел не может быть отрицательным числом! Если A=-5 и B=2, то имеем всего два числа допустимых в качестве остатка от целочисленного деления — это 0 и 1!
Из вашего же выражения следует, что неполное частное от целочисленного деления равно (-2). Проверим выполняется ли равенство A=B*C+D, при допустимых с точки зрения математики вероятных остатках 0 и 1.

1) A=2*(-2)+0 = -4 => равенство не выполняется, по скольку искомое делимое A равно (-5)!

2)A = 2 * (-2) + 1 = -3 => равенство не выполняется, по аналогичным причинам!

Таким образом можно сделать вывод, что число (-2) не является неполным частным от целочисленного деления -5 на 2 с точки зрения математики. Что и требовалось доказать.

Отвечая на ваш вопрос, математически меня не устраивает ни неполное частное в виде (-2), поскольку он не верен, ни остаток в виде (-1), поскольку математически он не допустим по определению. А вот с точки зрения информатики вполне допустимый результат.

Я всего-лишь хотел привлечь внимание к тому факту, что понятия «целочисленное деление» в информатике и «целочисленное деление» в математике имеют существенные различия. Это надо знать и учитывать. Особенно, когда пишутся программы для математических вычислений.

Источник

Читайте также:  String class in java questions
Оцените статью