JavaRush /Курсы /Java Syntax /Задачи на преобразование целых типов

Задачи на преобразование целых типов

Java Syntax
10 уровень , 4 лекция
Открыта

— Привет, Амиго! Вот тебе задачи на преобразование целых типов. Расставь где нужно оператор приведения типа:

Комментарии (342)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Игорь Уровень 16
22 августа 2024
задачки для знатоков)
BuyankinM Уровень 43
12 мая 2023
Приведение бесконечности к long красиво выглядит ) (long) (1234.0 / 0) После работы с другими языками ждал ошибку.
Maxim Belich Уровень 28
5 марта 2023
Оставлю для будущих поколений.. Поделюсь своими наблюдениями на тему 2 задачи под названием "Приблизительное значение". Для начала советую не спеша изучить процесс перевода десятичного числа в двоичную систему счисления числа с плавающей точкой. После изучения этой темы вам будет известно как число с плавающей точкой хранится в памяти: 1 бит хранит знак, 8 битов хранят экспоненту, оставшиеся 23 бита хранят мантиссу. После ручного перевода числа с плавающей точкой в двоичную систему счисления вам будет известно почему числа на выходе так странно округляются (23 бита мантиссы недостаточно, чтобы хранить всё число). Я задал вопрос на StackOverflow про такое округление. Вот что мне ответили: Эти преобразования используют round-to-nearest mode, т.е. выбирается ближайшее число, которое представимо в нужном формате. В Вашем случае один кандидат меньше исходного числа на 82, другой больше на 46. Выбирается второй, т.к. он "ближе" Ответ всего один и то мало понятный, но после кое-каких манипуляций я стал немного больше понимать "round-to-nearest mode" Посмотрим на такой пример:

long a = Long.MAX_VALUE;
float b = (float) a;
long c = (long) b;
System.out.println(a); // вывод 9223372036854775807
System.out.println(b); // вывод 9.223372E18
System.out.println(c); // вывод 9223372036854775807

long aa = 1234567890;
float bb = (float) aa;
long cc = (long) bb;
System.out.println(aa); // вывод 1234567890
System.out.println(bb); // вывод 1.23456794E9
System.out.println(cc); // вывод 1234567936
Получается какой-то абсурд. Получается, что float b может хранить в себе число Long.MAX_VALUE без потерь, а число меньше (1234567890) не может! Я попробовал сделать тоже самое, но с int:
Maxim Belich Уровень 28
5 марта 2023


int i = Integer.MAX_VALUE;
float f = i;
int result = (int) f;
System.out.println(i); //output : 2147483647
System.out.println(f); //output : 2.14748365E9
System.out.println(result); //output : 2147483647
Опять получается абсурд! Число интеджера MAX_VALUE флоат хранить может без потерь, а число меньше 1234567890 хранить не может! И тут то закрался вопрос - почему всё прекрасно работает, когда мы даём флоату максимальные числа разных типов данных? Может он может хранить без потерь только их? Давайте попробуем сделать по-другому, а именно отнимем единицу от Integer.MAX_VALUE:

int i = Integer.MAX_VALUE - 1;
float f = i;
int result = (int) f;
System.out.println(i); //output : 2147483646
System.out.println(f); //output : 2.14748365E9
System.out.println(result); //output : 2147483647
Как мы видим, в 3 sout мы получаем число не такое, которое мы получили в 1 sout. Третье число как-то "само округлилось" в большую сторону. И я не знаю почему) По всей видимости так и работает этот загадочный (по крайне мере пока что) round-to-nearest mode.
Владислав Уровень 16
13 апреля 2023
было интересно! а еще у меня возникла другая гипотеза, пока разбирался, что вы написали. Нечетные числа - без потерь, а четные - с приближением)) Но это лишь на ваших примерах. Потом я проверил - это не подтвердилось)
Timur Khasmamedov Уровень 14 Expert
1 февраля 2023
Кому нужно объяснение, ловите... По третьей задаче.

double d = (short) 2.50256e2d; //250
500e-3 //0.5
почему ? для начала. что такое scientific notanion. если сильно упрощать, это запись иначе того, что мы обычно представляем как десятичные числа, но запись хитрая. внимание на e2d и e-3 на конце записей. здесь это в первом случае Е2 = 10^2, а д - double precision exponent. точность, если упрощать. двойная (дабл) что в итоге получаем ? в первом случае: 2.50256*100=250.256, дробная часть отбрасывается, в итоге 250. во втором: 500e-3, обратите внимание на - (или минус 3). потому что это 10^(-3) или... 1/1000, или 500*0.0001, в итоге 0.5 Также как и с шортом выше,

short s = (short) 2.22; //2
Теперь. 150000 / 'd' - тут от чара берется значение https://unicode-table.com/en/ интовое, а именно 100, в итоге получается 1500 По второй задаче. float f = (byte) 128.50; здесь будет -128.0 почему ? вначале приводим к байту, отбрасываем дробное значение. выходит 128 128 не лезет в +127 (верхняя граница байта), потому...

128 % 256 = 128. 128 > 127 ? да. (если бы "нет", на этом бы остановились) 128 - 256 = -128
ну и в конце приводим обратно к флоату, добавляя дробную часть. если не заморачиваться с вычислениями и принять как данность, будет усечение с "сюрпризом". если интересно, можно разложить побитово и поиграться с значением, будет тот же результат, но возможно более поянтно.
Lir Уровень 14
5 июня 2023
спасибо за объяснение, особенно за пояснение значения переменной типа char.
Goodislav Уровень 24
13 января 2024
Спасибо за разъяснение. Тут обнаружил опечатку: лишний ноль в 0.001 (одна тысячная) "потому что это 10^(-3) или... 1/1000, или 500*0.0001, в итоге 0.5"
sH@Rk Уровень 13
22 октября 2022
Ндя, очень хотелось бы подробных разьяснений как решается последняя задача да как происходит приведение типов и их значений в этом случае. Да еще впервые вижу запись чисел через черточку
Bingo Boom Уровень 30
2 сентября 2022
Сделал задачи и даже как-то с лёгкостью, но сам не понял как это вышло, буду разбираться ещё в теме
Кристина Уровень 29
19 августа 2022
используйте дебаг и пишите расчёты на бумажке, так в тыщу раз легче))))
sH@Rk Уровень 13
22 октября 2022
Как раз собрался искать инфо, как использовать дебаг. Есть где инфо, чтоб долго не искать? спасибо!
Кристина Уровень 29
24 октября 2022
была лекция по этой теме где-то в начале
Сергей Уровень 14
5 июля 2022
у меня тоже знатно подгорело. Задачи - бред.
Алексей Щукин Уровень 28
24 апреля 2022
Подскажите, по какой причине при преобразовании целого числа 1234567890 во float получается 1.23456794E9, а не 1.23456789E9? Ведь знаков после запятой и в первом и во втором случае одинаковое количество и вроде как нет необходимости подрезать точность.
Ilya Mamedov Уровень 19
14 апреля 2022
Для чего делать такие задания для такой простой темы