web-dev-qa-db-fra.com

Java: double vs float

Dans un autre exercice de Bruce Eckel, le code que j'ai écrit prend une méthode et change de valeur dans une autre classe. Voici mon code:

class Big {
  float b;
}

public class PassObject {
  static void f(Letter y) {
    y.c = 'z';
  } //end f()
  static void g(Big z) {
    z.b = 2.2;
  }

  public static void main(String[] args ) {
    Big t = new Big();
    t.b = 5.6;
    System.out.println("1: t.b : " + t.b);
    g(x);
    System.out.println("2: t.b: " + t.b);
  } //end main
}//end class

Il y a une erreur disant "Perte de précision possible".

PassObject.Java:13: possible loss of precision
found: double
required : float   z.b = 2.2
passobject.Java:20: possible loss of precision
found : double
required : float   t.b = 5.6

doubles ne peut-il pas être floats également?

merci d'avance

22
phill

Oui, mais vous devez spécifier qu'il s'agit de floats, sinon ils sont traités comme des doubles:

z.b = 2.2f

Le «f» à la fin du nombre en fait un float au lieu d'un double.

Java ne réduit pas automatiquement un double à un float.

32
mipadi

Non, les flottants peuvent être convertis automatiquement en doublons, mais les doublons ne peuvent jamais être flottants sans transtypage explicite, car les doublons ont la plage la plus large.

la plage de float va de 1.40129846432481707e-45 à 3.40282346638528860e+38

la plage double va de 4.94065645841246544e-324d à 1.79769313486231570e+308d

17
Powerlord

Par défaut, Java traitera une décimale (par exemple "4.3") comme un double, sauf indication contraire de la part de float en ajoutant un f après le nombre (par exemple "4.3f").

Vous rencontrez le même problème sur les deux lignes. Premièrement, le littéral décimal est interprété comme un double par le compilateur. Il tente ensuite de l'attribuer à b, qui est de type float. Étant donné que double correspond à 64 bits et que float ne représente que 32 bits (voir la documentation relative aux primitives de Java ), Java vous indique une erreur indiquant que le paramètre float ne peut pas tenir dans le double. La solution consiste à ajouter un f à vos littéraux décimaux.

Si vous tentiez de faire le contraire (c’est-à-dire d’attribuer un float à un double), ce serait bien, car vous pouvez insérer les 32 bits d’un float dans un 64 de double.

9
mtlynch

Ne pas utiliser float. Il n'y a presque jamais de bonne raison de l'utiliser et cela ne fait pas plus de dix ans. Il suffit d'utiliser double.

6
Peter Lawrey
can't doubles be floats as well?

Non. Chaque valeur ou variable a exactement un type (double, float, int, long, etc ...). La Spécification du langage Java indique exactement ce qui se passe lorsque vous essayez d'affecter une valeur d'un type à une variable d'un autre type. En général, les assignations d'une valeur "plus petite" à un type "plus grand" sont autorisées et implicites, mais les assignations dans lesquelles des informations peuvent être perdues car le type de cible est trop "petit" pour contenir toutes les valeurs du type Origin ne sont pas autorisées par le programme. compilateur, même si la valeur concrète correspond au type de cible.

C’est pourquoi le compilateur se plaint que l’attribution d’une valeur double (qui correspond implicitement à la valeur littérale) à une variable float risque de perdre des informations, et vous devez la calmer soit en transformant la valeur en float, soit en la convertissant explicitement.

Les calculs sont souvent un facteur de confusion, car ils sont implicitement "élargis" à int pour des raisons techniques. Donc, si vous multipliez deux courts métrages et essayez d’affecter le résultat à un court métrage, le compilateur se plaindra car le résultat du calcul est un entier.

3
Michael Borgwardt

la plage de float est inférieure au double, de sorte qu'un float peut être facilement représenté en double, mais l'inverse n'est pas possible car, disons que nous prenons une valeur hors de la plage de flottement, nous perdrons les données exactes lors de la convention

0
sumanta