После редактирования вопроса ОП спросил:
3-й распечатан System.out.println (ageEarth1); это когда преобразуется в ageEarth1 = (long) ageEarth1; это должно дать результат целого числа правильно? Так почему же до сих пор даётся научная запись c?
Я постараюсь повторить ответ Карджениката и уточнить его. Надеюсь, это поможет!
Я разделю это на 2 части:
- операторы присваивания
- операторы печати (форматирование чисел)
Заявления о назначении
Вот операторы (где «A» для назначения, а «P» для печати):
long ageEarth = 4543000000L; // A1
System.out.println(ageEarth); // P1
double ageEarth1 = ageEarth; // A2
System.out.println(ageEarth1); // P2
ageEarth1 = (long) ageEarth1; // A3
System.out.println(ageEarth1) // P3
long ageEarth2 = (long) ageEarth1; // A4
System.out.println(ageEarth2); // P4
Просмотр оператора A3 Следует отметить, что он не создает новую переменную - он повторно использует переменную из A2: double ageEarth1
. Конечным результатом A3 является то, что переменная ageEarth1
все еще является double
.
Мы не меняли тип данных переменной .
Фактически, Java компилятор не позволил бы вам изменить его , даже если бы вы попытались.
Итак, что это делает (long) ageEarth1
в выражении A3? Он принимает значение, хранящееся в ageEarth1
(из оператора A2), и преобразует его из double
структуры хранения в long
структуру хранения *.
Но затем, как мы уже видели, этот результат присваивается обратно переменной ageEarth1
, которая по-прежнему равна double
. Таким образом, хранилище снова преобразуется из long
в double
*.
Печать отчетов
Почему в этом примере float
значения используют научную нотацию c, когда они отображаются в операторах печати? Это обобщено в документации - см. Точку с маркером, которая начинается:
Если m меньше 10 -3 или больше или равно 10 7 , тогда он представлен в так называемой «компьютеризированной научной нотации c».
В отличие от этого правила печати long
обобщены здесь здесь .
* Концептуально, по крайней мере. Под прикрытием реализация Java может оказаться умнее, чем я предлагаю.