Приведение типов (Casting): расширение и сужение

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Приведение типов (casting) в Java нужно, когда значения разных числовых типов участвуют в выражениях или присваиваниях. Расширение (например, intlongdouble) обычно происходит автоматически. Сужение (например, doubleint) требует явного приведения: (int), потому что возможна потеря дробной части или переполнение. В практических заданиях онлайн вы научитесь читать такие места в коде и понимать, какой результат получится.

Пример:

double d = 3.9; int x = (int) d; // x = 3

Список тем

1. Сопоставь: расширение vs сужение

id: 40438_cast_01_compare_widen_narrow

В левой колонке указаны направления приведения примитивных числовых типов в Java (например, из меньшего диапазона в больший или наоборот). В правой колонке описаны свойства такого приведения: выполняется ли оно автоматически, нужно ли явное приведение через скобки, и возможна ли потеря данных. Сопоставьте каждый вариант приведения слева с единственным подходящим описанием справа.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
byte → int
int → long
int → double
double → int
long → int
float → long
Сужающее преобразование: требуется явное приведение, возможны потеря точности и неожиданный результат при больших значениях из-за ограничений представления float.
Расширяющее преобразование: выполняется автоматически, потери данных не происходит.
Расширяющее преобразование: выполняется автоматически, но при переходе к типу с плавающей точкой точность может измениться из-за особенностей представления чисел.
Сужающее преобразование: требуется явное приведение, возможна потеря данных из-за выхода за диапазон типа (переполнение).
Сужающее преобразование: требуется явное приведение, дробная часть отбрасывается (округления не происходит).
Сужающее преобразование: требуется явное приведение через скобки (type).
Сообщения
Проверить
Показать подсказку

2. Заполни выражение нужными приведениями

id: 40438_cast_02_select_fill_numeric_expression

В фрагменте Java-кода есть несколько пропусков. Ваша задача — выбрать подходящие варианты из выпадающего списка так, чтобы вычисления с делением выполнялись в типе double там, где нужна дробная часть, а затем результат корректно приводился к int и сохранялся в целочисленную переменную. Обратите внимание: без нужных приведений/литералов деление int на int даст целое число.

Нужно правильно расставить в пропуски предложенные варианты
int total = 7;
int count = 2;

double avg = input1S total / count;
int scaled = input2S (avg * input3S);

System.out.println(scaled);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Предскажи результат: дробная часть и (int)

id: 40438_cast_03_predict_result_truncation

В коде ниже нужно заполнить пропуски, выбирая варианты из списка. Цель — сделать так, чтобы выражение с делением считалось как вещественное (без потери дробной части), а затем результат можно было безопасно сохранить в целочисленной переменной через явное приведение. Подберите нужные приведения типов и литерал так, чтобы код компилировался и вывод был предсказуемым.

Выберите правильный вариант ответа
int sum = 9;
int n = 4;

// хотим получить 9 / 4 = 2.25
input1S avg = (input2S sum) / input3S;
int roundedDown = (int) avg;

System.out.println(roundedDown);
Сообщения
Проверить
Показать подсказку

4. Исправь ошибку: целочисленное деление там, где ждут дробь

id: 40438_cast_04_error_integer_division

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

Найдите ошибку и исправьте
public class Main {
    public static void main(String[] args) {
        int sum = 5;
        int count = 2;
        double avg = sum / count;
        System.out.println(avg);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Впиши явное приведение для сужения

id: 40438_cast_05_replace_explicit_cast

В фрагменте Java-кода вычисляется среднее значение как число с плавающей точкой, но затем его нужно сохранить в переменную целочисленного типа. Такое присваивание является сужающим преобразованием и требует явного приведения типов. Заполните пропуски так, чтобы код компилировался, выполнялся и выводил целочисленную часть среднего значения.

Заполните пропуски
public class Main {
    public static void main(String[] args) {
        int sum = 7;
        int count = 2;
        double avg = (double) sum / count;
        int whole = input1S avg;
        System.out.println(whole);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Выстрой шаги: как происходит вычисление выражения с разными типами

id: 40438_cast_06_sequencing_rules

Перед вами перемешанные шаги, описывающие общий порядок вычисления выражения в Java, когда в нём участвуют разные числовые типы (например, int и double). Расставьте строки сверху вниз так, чтобы получилась логичная последовательность: от определения типов операндов до получения результата и, при необходимости, приведения при присваивании.

Расставьте строки в правильном порядке
Полученный результат имеет вычисленный тип (например, double) и уже может участвовать в следующих вычислениях.
Если при присваивании требуется сужение, используется явное приведение в круглых скобках, и дробная часть/диапазон могут быть потеряны.
Определяется тип результата операции после продвижения (например, int + double даёт double).
Для бинарной числовой операции выполняется числовое продвижение: более узкий операнд приводится к более широкому типу.
Вычисляется значение выражения (сложение/деление и т.п.) в этом получившемся общем типе.
Если результат присваивается переменной, проверяется совместимость типов при присваивании.
Определяются типы всех операндов в выражении (например, int и double).
Сообщения
Проверить
Показать подсказку

7. Собери код: явное приведение и вывод результата

id: 40438_cast_07_build_from_parts_safe_narrowing

Из предложенных строк соберите корректную Java-программу, которая показывает сужающее преобразование: берёт значение типа double, явно приводит его к int и выводит в консоль сначала исходное значение, затем результат после приведения. Одна строка в банке лишняя и в итоговый код попадать не должна.

Перетяните в правильном порядке строки из одного блока в другой
        int narrowed = (int) value;
public class Main {
        System.out.println(narrowed);
    public static void main(String[] args) {
        int narrowed = value;
        double value = 3.9;
        System.out.println(value);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру