Java: deux vs flotteur
-
16-09-2019 - |
Question
Dans un autre exercice Bruce Eckel, le code que j'ai écrit prend une valeur de la méthode et des changements 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 est lancer une erreur « perte possible de précision ».
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
ne peut pas être double
s float
s aussi bien?
merci à l'avance
La solution
Oui, mais vous devez spécifier qu'ils sont flotteurs, sinon ils sont traités comme doubles:
z.b = 2.2f
« f » à la fin du numéro, il est un flotteur au lieu d'un double.
Java ne sera pas automatiquement réduire un double à un flotteur.
Autres conseils
Non, flotteurs peuvent être automatiquement upcast à double, mais en double ne peut jamais être flotteurs sans coulée explicite, car doubles ont la plus grande plage.
gamme de flotteur est 1.40129846432481707e-45
à 3.40282346638528860e+38
double rangée est 4.94065645841246544e-324d
à 1.79769313486231570e+308d
Par défaut, Java traitera un nombre décimal (par exemple « 4.3
») en tant que double
, sauf indication contraire une float
en ajoutant un f après le nombre (par exemple « 4.3f
»).
Vous le même problème sur les deux lignes. Tout d'abord, le littéral décimal est interprété comme un double par le compilateur. Il tente ensuite de l'assigner à b
, qui est de type float
. Etant donné qu'un double
est de 64 bits et un float
est seulement 32 bits (voir la documentation de Java primitives de ), Java vous donne une erreur indiquant que le float
ne rentre pas à l'intérieur du double
. La solution est d'ajouter un f à vos littéraux décimaux.
Si vous essayez de faire le contraire (à savoir attribuer un float
à un double
), ce serait bien puisque vous pouvez installer un 32 bits de float
dans un de double
64.
Ne pas utiliser float. Il n'y a presque jamais une bonne raison de l'utiliser et n'a pas été depuis plus d'une décennie. Il suffit d'utiliser double.
can't doubles be floats as well?
Non. Chaque valeur ou variable a exactement un type (double, flotteur, int, long, etc ...). Java Language Specification les états de exactement ce qui se passe lorsque vous essayez d'attribuer une valeur d'un type à une variable d'un autre type. En général, les affectations d'une « petite » valeur à un type « plus » sont autorisés et fait implicitement, mais des missions où l'information pourrait être perdue parce que le type de cible est trop « petit » pour maintenir toutes les valeurs du type d'origine ne sont pas autorisés par la compilateur, même si la valeur concrète ne correspond dans le type de cible.
C'est pourquoi le compilateur se plaint que l'attribution d'une variable à double valeur (dont le sens littéral est implicitement) à un flotteur pourrait perdre des informations, et vous devez amadouer ce soit faire la valeur d'un flotteur, ou en jetant explicitement.
Une zone qui provoque souvent des calculs est la confusion, car ceux-ci sont implicitement « élargi » int pour des raisons techniques. Donc, si vous multipliez deux courts métrages et essayez d'affecter le résultat à un court, le compilateur se plaindra parce que le résultat du calcul est un int.
plage de flotteur est inférieure au double si un flotteur peut être facilement représenté en double, mais l'inverse est impossible, car, disons que nous prenons une valeur qui est hors de portée de flotteur puis lors de la convention, nous allons perdre les données exactes