2012-08-10 3 views
6

En Java, nous pouvons convertir implicitement un int pour le faire flotter, ce qui peut entraîner une perte de précision, comme indiqué dans l'exemple de code ci-dessous.Java autorise la conversion implicite de int en float. Pourquoi?

public class Test { 
    public static void main(String [] args) { 
     int intVal = 2147483647; 
     System.out.println("integer value is " + intVal); 
     double doubleVal = intVal; 
     System.out.println("double value is " + doubleVal); 
     float floatVal = intVal; 
     System.out.println("float value is " + floatVal); 
     } 
} 

La sortie est

integer value is 2147483647 
double value is 2.147483647E9 
float value is 2.14748365E9 

Quelle est la raison qui permet la conversion implicite de int flotter, quand il y a une perte de précision?

+0

en double de http://stackoverflow.com/questions/11183980/why-does-c-sharp-allow-an-implicit-conversion-from-long-to-float-when-this-co –

+0

@ AaronKurtzhals: Cette question concerne une langue différente. – Wug

Répondre

6

Vous vous demandez probablement:

Pourquoi est-ce une conversion implicite quand il y a une perte d'information? Est-ce que ce ne devrait pas être une conversion explicite?

Et vous avez bien sûr un bon point. Mais les concepteurs de langage ont décidé que si le type de cible avait une portée suffisamment grande, une conversion implicite est autorisée, même s'il peut y avoir une perte de précision. Notez que c'est la plage qui est importante, pas la précision. Un flottant a une plus grande portée qu'un int, c'est donc une conversion implicite.

Le Java specification dit le texte suivant:

Une conversion élargissement d'un int ou d'une valeur à long flotter ou d'une longue valeur à doubler, peut entraîner une perte de précision - qui est, le résultat peut perdre certains des bits les moins significatifs de la valeur. Dans ce cas, la valeur à virgule flottante résultante sera une version correctement arrondie de la valeur entière, en utilisant le mode arrondi au plus proche IEEE 754.

+0

Une idée de pourquoi «float» de 32 bits est considéré comme plus large que «long» de 64 bits? –

+2

@PeterLawrey: Un flottant a une plage de -3.4e + 38 à 3.4e + 38 (environ). Un long a une gamme de -9.2e18 à -9.2e18. Puisque le flotteur a la plus grande portée, il est plus large. –

+0

C'est probablement la pensée. Le problème que j'ai est quand vous passez un 'long' à une méthode qui prend un' float' par accident, il peut transformer 64 bits de précision en 24 bits: P –

Questions connexes