2009-08-31 10 views
3

Je comprends que "2.5" est automatiquement un double, et pour le faire flotter, je dois faire "2.5F" (ou le F devrait-il être en minuscule?), Et que Je devrais utiliser un flotteur, disons, si j'avais une constante qui ne nécessitait que 2 espaces décimaux (comme "0.08F" pour la taxe provinciale de l'Ontario), mais je ne suis pas sûr que "12" soit un int ou un long, mais Je sais que "12L" est un long, mais "long l = 12" et "long l = 12L" semblent compiler à la même chose, et j'utilise long si je veux une précision maximale non-flottante, et int si je sais Je n'aurai pas besoin au-delà des limites d'int.Java - int/long, float/double

Corrigez-moi s'il y a quelque chose qui ne va pas et répondez aux questions que j'ai.

Répondre

14

12 comme constante dans Java est un int.

La raison pour laquelle long l = 12 compile est qu'il est automatiquement élargi à un long.

EDIT: En ce qui concerne votre commentaire, il n'y a rien de mal à élargir automatiquement, utilisez tout ce qui rend votre code plus clair, mais soyez conscient de ce qui se passe quand vous faites des maths sur les primitives. Par exemple:

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

La longue aura une valeur très différente si vous ne mettez pas explicitement ce numéro d'abord comme un long parce que Java traitera comme les mathématiques entier, et provoquer un débordement.

+0

Devrais-je mettre le L de toute façon ou simplement le laisser s'évaser automatiquement? – mk12

+2

Il n'y a rien de mal avec l'élargissement automatique, utilisez ce qui rend votre code plus clair. – Yishai

3

D'abord, 12 est un int. Puisque vous n'avez pas spécifié de type, le compilateur suppose int, tout comme il suppose double lorsque vous ne spécifiez pas de type pour 2.5.

L'affectation

long x = 12; 

compile très bien parce qu'il n'y a pas de perte de précision lorsque le compilateur upcasts implicitement la valeur littérale int 12 à un long. J'essaie toujours d'utiliser des spécificateurs de type majuscules comme 2.5F et 12L, simplement parce qu'ils sont plus faciles à lire. Je ressemble beaucoup à la police monospace que je préfère.

7

Cela ne fait aucune différence si vous utilisez des majuscules ou des minuscules lors de la déclaration float s.

... comme "0.08F" pour l'impôt TVP de l'Ontario

Si vous utilisez ces champs pour devise, vous devriez envisager d'utiliser BigDecimal à la place. See this explanation et ses liens connexes de Sun pour plus de détails.

+6

+1. S'il vous plaît ne pas utiliser de nombres à virgule flottante pour les devises, JAMAIS –

+0

Travaillant dans l'industrie financière, l'écriture de logiciels pour les institutions financières, je suis d'accord.En fait, j'essaie d'éviter les doubles autant que possible, même dans les endroits où la précision n'est pas si importante - à moins d'avoir besoin de vitesse, je préférerais avoir trop de précision que pas assez :) – aperkins

+0

J'utilisais des positions longues distinctes pour représenter les devises , mais apparemment j'aurais dû utiliser BigDecimal, de toute façon. – mk12

3

Notez que tout int littéraux seront automatiquement élargi à long lors de l'affectation à une variable long, vous devez utiliser un explicite long littérale en exprimant une valeur qui est supérieure à Integer.MAX_VALUE (2147483647) ou moins de Integer.MIN_VALUE (- 2147483648):

long x1 = 12; //OK 
long x2 = 2147483648; // not OK! That's not a valid int literal 
long x3 = 2147483648L; // OK