Числовые типы данных и операции
В Java имеется шесть числовых типов данных для целых и вещественных чисел с операторами +, -, * , / и %.
Каждый тип данных имеет диапазон значений. Компилятор выделяет место в памяти для каждой переменной или константы в соответствии с ее типом данных. Java предоставляет восемь примитивных типов данных для числовых значений, символов и логических значений. В этом подразделе курса описываются числовые типы данных и операторы.
Числовые типы данных
Для целых чисел в Java используется четыре типа данных: byte, short, int и long. Всегда выбирайте тип данных, наиболее подходящий для переменной. Например, если известно, что целое число, хранящееся в переменной, находится в диапазоне значений типа данных byte, то объявите переменную типа byte. Для простоты и связности мы будем использовать тип данных int для целых чисел в большей части этого курса.
Для чисел с плавающей точкой в Java используется два типа данных: float и double. Диапазон значений типа данных double в два раза больше, чем float, поэтому значения типа double еще называются числами двойной точности, а float — одинарной точности. Как правило, мы будем использовать тип данных double, поскольку он более точен, чем float.
В следующей таблице перечислены шесть числовых типов данных, диапазоны их значений и объем памяти для хранения одного значения.
Имя типа данных | Диапазон значений | Объем памяти |
byte | от -27 до 27 - 1 | 8 бит (со знаком) |
short | от -215 до 215 - 1 | 16 бит (со знаком) |
int | от -231 до 231 - 1 | 32 бита (со знаком) |
long | от -263 до 263 - 1 (от -9223372036854775808 до 9223372036854775807) | 64 бита (со знаком) |
float | Отрицательные: Положительные: | 32 бита (IEEE 754) |
double | Отрицательные: Положительные: | 64 бита (IEEE 754) |
Заметка
IEEE 754 — это стандарт, утверждённый Институтом инженеров по электротехнике и электронике (США), для представления вещественного числа в компьютере в экспоненциальной форме, в которой число хранится в виде мантиссы и порядка (показателя степени). Такая форма представления вещественного числа называется числом с плавающей точкой. В Java используются 32 бита (IEEE 754) для типа данных float и 64 бита (IEEE 754) — для типа данных double.
Считывание чисел с клавиатуры
Вы уже знаете, как использовать метод nextDouble() из класса Scanner для считывания с клавиатуры значения типа double. Точно так же можно использовать методы, перечисленные в следующей таблице, для считывания чисел типов данных byte, short, int, long и 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 + 1 | 35 |
- | Вычитание | 34.0 - 0.1 | 33.9 |
* | Умножение | 300 * 30 | 9000 |
/ | Деление | 1.0 / 2.0 | 0.5 |
% | Остаток от деления | 20 % 3 | 2 |
Когда оба операнда при делении являются целыми числами, результатом деления является целая часть частного, а дробная часть усекается, как в результате деления «в столбик». Например, 5 / 2 равно 2, а не 2.5, и -5 / 2 равно -2, а не -2.5. Для нахождения частного с плавающей точкой одним из операндов деления должно быть число с плавающей точкой. Например, 5.0 / 2 равно 2.5.
Оператор %, известный как остаток от деления, дает остаток в результате деления «в столбик».
Операнд слева от % является делимым, а операнд справа — делителем. Поэтому:
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 секунд.
Таблица трассировки:
№ строчки | seconds | minutes | remainingSeconds |
11 | 500 | ||
14 | 8 | ||
17 | 20 |
Метод nextInt() (строчка №11) считывает целое число в переменную seconds. В строчке №14 вычисляются минуты с помощью выражения seconds / 60. В строчке №17 (seconds % 60) вычисляется кол-во секунд, оставшихся в минуте.
Операторы + и - могут быть как унарными, так и бинарными. Унарный оператор имеет только один операнд, а бинарный оператор имеет два операнда. Например, оператор - в -5 является унарным оператором для отрицания числа 5, тогда как оператор - в 4 - 5 является бинарным оператором для вычитания 5 из 4.
Операция возведения в степень
Для вычисления
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);
отображает
System.out.println("1.0F / 3.0F равно " + 1.0F / 3.0F);
отображает
Значение типа float имеет 7-8 значащих цифр, а значение типа double — 15-17 значащих цифр.
Экспоненциальная нотация
Литералы с плавающей точкой могут быть записаны в экспоненциальной нотации в виде
Заметка
Типы данных float и double используются для представления десятичных чисел с точкой. Почему их называют числами с плавающей точкой? Потому что эти числа в компьютере хранятся в экспоненциальном представлении. Когда, например, число 50.534, сохраняется в программе, допустим, 5.0534E+1, то его точка перемещается («плывет») на новую позицию.
Составные операторы присваивания
Арифметические операторы +, -, * , / и % можно объединять с оператором присваивания для формирования составных операторов.
Очень часто текущее значение переменной используется, потом изменяется, а затем опять присваивается этой же переменной. Например, следующее предложение увеличивает значение переменной count на 1:
count = count + 1;
В Java разрешается объединять оператор присваивания и оператор сложения с помощью составного оператора присваивания. Например, предыдущее предложение может быть записано как
count += 1;
Оператор += называется оператором сложения с присваиванием. В следующей таблице показаны остальные составные операторы присваивания.
Оператор | Имя | Пример | Эквивалент |
+= | Сложение с присваиванием | i += 8 | i = i + 8 |
-= | Вычитание с присваиванием | i -= 8 | i = i - 8 |
*= | Умножение с присваиванием | i *= 8 | i = i * 8 |
/= | Деление с присваиванием | i /= 8 | i = i / 8 |
%= | Остаток от деления с присваиванием | i %= 8 | i = i % 8 |
Составной оператор присваивания выполняется самым последним после выполнения в выражении всех остальных операторов. Например,
x /= 4 + 5.5 * 1.5;
эквивалентно
x = x / (4 + 5.5 * 1.5);
Внимание
В составных операторах присваивания отсутствуют пробелы. Например, + = должно быть +=.
Заметка
Аналогично оператору присваивания (=) операторы (+=, -=, *=, /= и %=) могут использоваться для формирования предложений с присваиванием, а также выражений. Например, в следующем коде x += 2 в первой строчке является предложением, а во второй строчке — выражением:
x += 2; // Предложение System.out.println(x += 2); // Выражение