Java - int / long, float / double - PullRequest
       33

Java - int / long, float / double

3 голосов
/ 31 августа 2009

Я понимаю, что "2.5" автоматически является двойным, и чтобы сделать его плавающим, мне нужно сделать "2.5F" (или F должно быть в нижнем регистре?), И что я должен использовать float, скажем, если У меня была константа, которой когда-либо требовалось только 2 десятичных знака (например, «0.08F» для налога Онтарио PST), но я не уверен, является ли «12» целым или длинным, но я знаю, что «12L» - это длинное, но "long l = 12" и "long l = 12L", кажется, компилируются в одно и то же, и я использую long, если я хочу максимальную точность без плавающей запятой, и int, если я знаю, что мне не нужно выходить за пределы int.

Пожалуйста, поправьте меня, если там что-то не так, и ответьте на мои вопросы.

Ответы [ 4 ]

14 голосов
/ 31 августа 2009

12 как константа в java - это целое число.

Причина, по которой long = 12 компилируется, состоит в том, что он автоматически расширяется до long.

РЕДАКТИРОВАТЬ: Что касается вашего комментария, нет ничего плохого в автоматическом расширении, используйте все, что делает ваш код более понятным, но просто будьте в курсе того, что происходит, когда вы делаете математику на примитивах. Например:

int i = 1213;
long l = 112321321L * i;

Значение long будет иметь совсем другое значение, если вы не будете явно указывать это первое число как long, поскольку Java будет рассматривать его как целочисленную математику и вызывать переполнение.

7 голосов
/ 31 августа 2009

Не имеет значения, если вы используете нижний или верхний регистр при объявлении ваших float s.

... как "0.08F" для налога в PST Онтарио

Если вы используете эти поля для валюты, вам следует рассмотреть возможность использования BigDecimal. См. Это объяснение и связанные с ним ссылки от Sun для более подробной информации.

3 голосов
/ 31 августа 2009

Обратите внимание, что хотя литералы int будут автоматически расширены до long при назначении переменной long, вам нужно будет использовать явный литерал long при выражении значения, которое больше Integer.MAX_VALUE (2147483647) или меньше Integer.MIN_VALUE (-2147483648):

long x1 = 12; //OK
long x2 = 2147483648; // not OK! That's not a valid int literal
long x3 = 2147483648L; // OK
3 голосов
/ 31 августа 2009

Во-первых, 12 - это int. Поскольку вы не указали тип, компилятор принимает int, так же, как он принимает double, когда вы не указываете тип для 2.5.

Задание

long x = 12;

компилируется просто отлично, потому что нет потери точности, когда компилятор неявно преобразует буквальное значение int 12 в long.

Я всегда стараюсь использовать описатели типа в верхнем регистре, такие как 2.5F и 12L, просто потому, что их легче читать. 1 и l в моноширинном шрифте я выгляжу почти так же, как и я.

...