Friday, October 7, 2022

Числовые типы данных и операции

Числовые типы данных и операции

В Java имеется шесть числовых типов данных для целых и вещественных чисел с операторами +, -, * , / и %.

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

Числовые типы данных

Для целых чисел в Java используется четыре типа данных: byteshortint и long. Всегда выбирайте тип данных, наиболее подходящий для переменной. Например, если известно, что целое число, хранящееся в переменной, находится в диапазоне значений типа данных byte, то объявите переменную типа byte. Для простоты и связности мы будем использовать тип данных int для целых чисел в большей части этого курса.

Для чисел с плавающей точкой в Java используется два типа данных: float и double. Диапазон значений типа данных double в два раза больше, чем float, поэтому значения типа double еще называются числами двойной точности, а float — одинарной точности. Как правило, мы будем использовать тип данных double, поскольку он более точен, чем float.

В следующей таблице перечислены шесть числовых типов данных, диапазоны их значений и объем памяти для хранения одного значения.

Имя типа данныхДиапазон значенийОбъем памяти
byte

от -27 до 27 - 1
(от -128 до 127)

8 бит (со знаком)
short

от -215 до 215 - 1
(от -32768 до 32767)

16 бит (со знаком)
int

от -231 до 231 - 1
(от ‑2147483648 до 2147483647)

32 бита (со знаком)
longот -263 до 263 - 1
(от -9223372036854775808
до 9223372036854775807)
64 бита (со знаком)
float

Отрицательные:
от -3.4028235E+38
до -1.4E-45

Положительные:
от 1.4E-45
до 3.4028235E+38

32 бита (IEEE 754)
double

Отрицательные:
от -1.7976931348623157E+308
до -4.9E-324

Положительные:
от 4.9E-324
до 1.7976931348623157E+308

64 бита (IEEE 754)

 

  • Заметка

    IEEE 754 — это стандарт, утверждённый Институтом инженеров по электротехнике и электронике (США), для представления вещественного числа в компьютере в экспоненциальной форме, в которой число хранится в виде мантиссы и порядка (показателя степени). Такая форма представления вещественного числа называется числом с плавающей точкой. В Java используются 32 бита (IEEE 754) для типа данных float и 64 бита (IEEE 754) — для типа данных double.

Считывание чисел с клавиатуры

Вы уже знаете, как использовать метод nextDouble() из класса Scanner для считывания с клавиатуры значения типа double. Точно так же можно использовать методы, перечисленные в следующей таблице, для считывания чисел типов данных byteshortintlong и float.

МетодОписание
nextByte()считывает целое число типа byte
nextShort()считывает целое число типа short
nextInt()считывает целое число типа int
nextLong()считывает целое число типа long
nextFloat()считывает число с плавающей точкой типа float
nextDouble()считывает число с плавающей точкой типа double

 

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

 1 Scanner input = new Scanner(System.in);
 2 System.out.print("Введите значение типа byte: ");
 3 byte byteValue = input.nextByte();
 4
 5 System.out.print("Введите значение типа short: ");
 6 short shortValue = input.nextShort();
 7
 8 System.out.print("Введите значение типа int: ");
 9 int intValue = input.nextInt();
10
11 System.out.print("Введите значение типа long: ");
12 long longValue = input.nextLong();
13
14 System.out.print("Введите значение типа float: ");
15 float floatValue = input.nextFloat();

При вводе значения с неверным диапазоном или форматом произойдет ошибка во время выполнения. Например, если ввести значение 128 для строчки №3, то произойдет ошибка, так как 128 выходит за пределы диапазона значений целочисленного типа данных byte.

Числовые операторы

К операторам числовых типов данных относятся стандартные арифметические операторы: сложения (+), вычитания (-), умножения (*), деления (/) и остатка от деления (%), перечисленные в следующей таблице. Операнды — это значения, обрабатываемые операторами.

Имя оператораСмыслПримерРезультат
+Сложение34 + 135
-Вычитание34.0 - 0.133.9
*Умножение300 * 309000
/Деление1.0 / 2.00.5
%Остаток от деления20 % 32

 

Когда оба операнда при делении являются целыми числами, результатом деления является целая часть частного, а дробная часть усекается, как в результате деления «в столбик». Например, 5 / 2 равно 2, а не 2.5, и -5 / 2 равно -2, а не -2.5. Для нахождения частного с плавающей точкой одним из операндов деления должно быть число с плавающей точкой. Например, 5.0 / 2 равно 2.5.

Оператор %, известный как остаток от деления, дает остаток в результате деления «в столбик».

2.0

Операнд слева от % является делимым, а операнд справа — делителем. Поэтому:

7 % 3 равно 1

3 % 7 равно 3

12 % 4 равно 0

26 % 8 равно 2

20 % 13 равно 7

Оператор % часто используется для положительных целых чисел, но он также может использоваться с отрицательными целыми числами и числами с плавающей точкой. Остаток отрицателен, только если делимое отрицательно. Например:

-7 % 3 равно -1

-12 % 4 равно 0

-26 % -8 равно -2

20 % -13 равно 7

Остаток от целочисленного деления очень полезен при программировании. Например, четное число % 2 всегда равно 0, а положительное нечетное число % 2 всегда равно 1. Таким образом, это свойство можно использовать для определения четности или нечетности числа. Если сегодня суббота, то через 7 дней снова будет суббота. Предположим, вы с друзьями договорились встретиться через 10 дней. Какой день недели будет через 10 дней? Вы можете вычислить, что это вторник, используя следующее выражение:

Программа DisplayTime вычисляет и отображает время в минутах и оставшихся секундах, исходя из введенного пользователем общего времени в секундах. Например, 500 секунд содержит 8 минут и 20 секунд.

Таблица трассировки:

№ строчкиsecondsminutesremainingSeconds
11500  
14 8 
17  20

 

Метод nextInt() (строчка №11) считывает целое число в переменную seconds. В строчке №14 вычисляются минуты с помощью выражения seconds / 60. В строчке №17 (seconds % 60) вычисляется кол-во секунд, оставшихся в минуте.

Операторы + и - могут быть как унарными, так и бинарными. Унарный оператор имеет только один операнд, а бинарный оператор имеет два операнда. Например, оператор - в -5 является унарным оператором для отрицания числа 5, тогда как оператор - в 4 - 5 является бинарным оператором для вычитания 5 из 4.

Операция возведения в степень

Для вычисления ab можно использовать выражение Math.pow(a, b). Метод pow() определен в Java API в классе Math. Этот метод вызывается с помощью синтаксиса Math.pow(a, b) (например, Math.pow(2, 3)), который возвращает результат ab (23). Здесь a и b являются параметрами для метода pow(), а числа 2 и 3 являются фактическими значениями, используемыми для вызова этого метода. Например,

System.out.println(Math.pow(2, 3)); // Отображает 8.0
System.out.println(Math.pow(4, 0.5)); // Отображает 2.0
System.out.println(Math.pow(2.5, 2)); // Отображает 6.25
System.out.println(Math.pow(2.5, -2)); // Отображает 0.16

Целочисленные литералы

Целочисленный литерал может быть присвоен целочисленной переменной, только если он может в нее поместиться. Если литерал слишком велик для хранения в переменной, то произойдет ошибка компиляции. Например, предложение byte b = 128 вызовет ошибку компиляции, поскольку 128 не может быть сохранено в переменной типа byte (обратите внимание, что диапазон значений типа данных byte находится в диапазоне от -128 до 127).

Как правило, целочисленный литерал имеет тип int, значение которого находится в диапазоне от -231 (-2147483648) до 231 - 1 (2147483647). Для обозначения целочисленного литерала типа long добавьте к нему букву L или l. Например, для записи целого числа 2147483648 в Java-программе необходимо написать его как 2147483648L или 2147483648l, поскольку 2147483648 выходит за диапазон значений типа int. Обозначение L является предпочтительным, поскольку l (строчная буква) можно легко перепутать с 1 (цифра).

  • Заметка

    По умолчанию целочисленный литерал является десятичным целым числом. Чтобы обозначить двоичный целочисленный литерал, добавьте в его начало 0b или 0B (ноль B); для обозначения восьмеричного целочисленного литерала добавьте в его начало 0 (ноль); а для обозначения шестнадцатеричного целочисленный литерала добавьте в его начало 0x или 0X (ноль X). Например:

    System.out.println(0B1111); // Отображает 15
    System.out.println(07777); // Отображает 4095
    System.out.println(0XFFFF); // Отображает 65535

  • Заметка

    В Java для улучшения читаемости разрешается использовать подчеркивания в числовом литерале между разрядами числа. Например, допустимы следующие литералы:

    long ssn = 232_45_4519;
    long creditCardNumber = 2324_4545_4519_3415L;

    Однако 45_ или _45 будут недопустимыми литералами. Знак подчеркивания обязательно должен быть помещен между разрядами числа.

Литералы с плавающей точкой

Литералы с плавающей точкой записываются в виде десятичных чисел с точкой, отделяющей целую часть числа от дробной. По умолчанию литерал с плавающей точкой обрабатывается как значение типа double. Например, 5.0 считается значением типа double, а не float. Можно сделать число типа float, добавив в конец числа букву f или F, и сделать число типа double, добавив в конец числа букву d или D. Например, можно использовать 100.2f или 100.2F для числа типа float, а 100.2d или 100.2D для числа типа double.

  • Заметка

    Значения типа double являются более точными, чем значения типа float. Например, следующее предложение

    System.out.println("1.0 / 3.0 равно " + 1.0 / 3.0);

    отображает

    1.0 / 3.0 равно 0.333333333333333316 знаков 

    System.out.println("1.0F / 3.0F равно " + 1.0F / 3.0F);

    отображает

    1.0F / 3.0F равно 0.333333348 знаков

    Значение типа float имеет 7-8 значащих цифр, а значение типа double — 15-17 значащих цифр.

Экспоненциальная нотация

Литералы с плавающей точкой могут быть записаны в экспоненциальной нотации в виде a×10b. Например, экспоненциальной нотацией для 123.456 является 1.23456×102, а для 0.0123456 является 1.23456×10-2. Для записи чисел в экспоненциальной нотации используется специальный синтаксис. Например, 1.23456×102 записывается как 1.23456E2 или 1.23456E+2, а 1.23456×10-2 — как 1.23456E-2. Буква E (или e) представляет экспоненту (степень) и может быть строчной или заглавной.

  • Заметка

    Типы данных float и double используются для представления десятичных чисел с точкой. Почему их называют числами с плавающей точкой? Потому что эти числа в компьютере хранятся в экспоненциальном представлении. Когда, например, число 50.534, сохраняется в программе, допустим, 5.0534E+1, то его точка перемещается («плывет») на новую позицию.


Составные операторы присваивания

Арифметические операторы +, -, * , / и % можно объединять с оператором присваивания для формирования составных операторов.

Очень часто текущее значение переменной используется, потом изменяется, а затем опять присваивается этой же переменной. Например, следующее предложение увеличивает значение переменной count на 1:

count = count + 1;

В Java разрешается объединять оператор присваивания и оператор сложения с помощью составного оператора присваивания. Например, предыдущее предложение может быть записано как

count += 1;

Оператор += называется оператором сложения с присваиванием. В следующей таблице показаны остальные составные операторы присваивания.

ОператорИмяПримерЭквивалент
+=Сложение с присваиваниемi += 8i = i + 8
-=Вычитание с присваиваниемi -= 8i = i - 8
*=Умножение с присваиваниемi *= 8i = i * 8
/=Деление с присваиваниемi /= 8i = i / 8
%=Остаток от деления с присваиваниемi %= 8i = i % 8

 

Составной оператор присваивания выполняется самым последним после выполнения в выражении всех остальных операторов. Например,

x /= 4 + 5.5 * 1.5;

эквивалентно

x = x / (4 + 5.5 * 1.5);
  • Внимание

    В составных операторах присваивания отсутствуют пробелы. Например, + = должно быть +=.

  • Заметка

    Аналогично оператору присваивания (=) операторы (+=, -=, *=, /= и %=) могут использоваться для формирования предложений с присваиванием, а также выражений. Например, в следующем коде x += 2 в первой строчке является предложением, а во второй строчке — выражением:

    x += 2; // Предложение
    System.out.println(x += 2); // Выражение