2009-08-31 4 views
3

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

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

ответ

14

12 как константа в java - это int.

Причина, по которой длинные l = 12 компиляции, заключается в том, что она автоматически расширяется до длинной.

EDIT: Что касается вашего комментария, нет ничего плохого в автоматическом расширении, используйте то, что делает ваш код более четким, но просто знайте, что происходит, когда вы делаете математику на примитивах. Например:

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

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

+0

Должен ли я поставить L в любом случае или просто позволить ему автоматически расширяться? – mk12

+2

Нет ничего плохого в автоматическом расширении, используйте то, что делает ваш код более четким. – Yishai

3

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

Назначения

long x = 12; 

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

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

7

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

... как "0.08F" для Ontario PST налога

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

+6

+1. Пожалуйста, не используйте числа с плавающей запятой для валют, EVER –

+0

Работая в финансовой отрасли, пишу программу для финансовых учреждений, соглашусь.На самом деле, я стараюсь избегать удвоения, где это возможно, даже в тех местах, где точность не так важна - если только мне не нужна скорость, я бы предпочел иметь слишком высокую точность, чем не достаточно :) – aperkins

+0

Я использовал отдельные длинны для представления валют , но, видимо, я должен был использовать BigDecimal. – mk12

3

Обратите внимание, что в то время как 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