Почему приведение этой переменной дает мне длинный тип данных, содержащий обозначения scientifi c? - PullRequest
0 голосов
/ 12 апреля 2020
public class HelloWorld {
  public static void main(String[] args) {
     long ageEarth = 4543000000L; 
     System.out.println(ageEarth);

     double ageEarth1 = ageEarth;
     System.out.println(ageEarth1);

     ageEarth1 = (long) ageEarth1;
     System.out.println(ageEarth1) 


}

Игра со значением 4543000000 и передача его в double и снова в long дает мне

scientifi c нотация: 4.543E9

но scientifi c нотация - это число с плавающей точкой, и long принимает только целые числа, что здесь происходит?

/////// РЕДАКТИРОВАТЬ:

Я применяю код, который вы, ребята, говорите мне, и дайте нам то, что мы ожидаем, но:

    long ageEarth = 4543000000L; 
    System.out.println(ageEarth);

    double ageEarth1 = ageEarth;
    System.out.println(ageEarth1);

    ageEarth1 = (long) ageEarth1;
    System.out.println(ageEarth1)

    long ageEarth2 = (long) ageEarth1; 
    System.out.println(ageEarth2);

Я не понимаю третий напечатано System.out.println(ageEarth1); это когда преобразуется в ageEarth1 = (long) ageEarth1; это должно дать результат целого числа верно? Так почему же до сих пор используется научная запись c?

enter image description here

Что вы имеете в виду, чтобы обрезать данные? Поправьте меня, вы имеете в виду испортить данные?

4.543E9 = 4543000000

Ответы [ 3 ]

4 голосов
/ 12 апреля 2020

ageEarth1 имеет тип double, а не long.

. Преобразование его в long путем его приведения усечет его, но затем вы сохраните его как double, поэтому при использовании он будет вести себя как один, потому что это double.

Если вы преобразуете его обратно и сохраните данные как long, вы увидите, что они печатаются так, как вы ожидаете:

long ageEarth2 = (long)ageEarth1;
System.out.println(ageEarth2);
1 голос
/ 12 апреля 2020

После редактирования вопроса ОП спросил:

3-й распечатан System.out.println (ageEarth1); это когда преобразуется в ageEarth1 = (long) ageEarth1; это должно дать результат целого числа правильно? Так почему же до сих пор даётся научная запись c?

number listing

Я постараюсь повторить ответ Карджениката и уточнить его. Надеюсь, это поможет!

Я разделю это на 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 может оказаться умнее, чем я предлагаю.

0 голосов
/ 12 апреля 2020

Спасибо за вашу помощь всем вам, теперь я понимаю:

Мы не можем реорганизовать или изменить тип данных переменной в новом другом выражении той же области, поэтому дайте мне научную c нотация, да приведение работает (long) ageEarth1 = 4543000000, но поскольку переменная ageEarth1 имеет тип double, она может поддерживать только число с плавающей запятой, поэтому для удовлетворения этого унаследованного экземпляра условие переменной заставит компилятор измените его снова с результата приведения на long 4543000000 TO 4.543E9.

Вот почему вы говорите мне, что мне нужно создать новую переменную long, чтобы она могла содержать целое число 4543000000, следовательно, компилятор не изменит результат приведения на long 4543000000 TO 4.543E9, поскольку он удовлетворяет условию содержания целых чисел.

...