Java: double vs flotteur
Dans un autre Bruce Eckel de l'exercice, le code que j'ai écrit prend une méthode et des changements de la 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
C'est jeter une erreur en disant "Possible perte 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 double
s être float
s ainsi?
merci d'avance
Vous devez vous connecter pour publier un commentaire.
Oui, mais vous devez spécifier qu'ils sont des flotteurs, sinon, ils sont traités comme des doubles:
Le " f " à la fin du nombre, il est un float au lieu d'un lit double.
Java ne sont pas automatiquement étroit, un double à un flotteur.
Non, les flotteurs peuvent être automatiquement sortie à double, mais le double ne peut jamais être flotteurs sans une conversion explicite parce que les doubles ont la plus grande portée.
float gamme est
1.40129846432481707e-45
à3.40282346638528860e+38
double gamme est
4.94065645841246544e-324d
à1.79769313486231570e+308d
4.1
dans unfloat
, je ne peut pas car il ne passe pas3.4xxx
de gamme? ne pouvez pas l'air de comprendre pourquoi la haute lié commence à3.xxx
quand u peut évidemment store999.99
pas de problème. Je suis de deviner le plus de points décimaux vous ajoutez le moins que vous pouvez utiliser en avant la virgule? alors pourquoi est-il3.XX
ne devrait-elle pas être0.XX
maximale?40,282,346,638,528,860,000,000,000,000,000,000,000
si elle ne prend que 4 octets de données? Je suppose environ 4 milliards de dollars serait la limite à moins de flotteurs ont une sorte de compression? Je ne comprends flotteurs/doubles sont à perte et ne peut jamais stocker une valeur exacte, par conséquent, ne devraient jamais être utilisés pour les devises.x * 2^y
. Pour unfloat
, de gauche à droite, les bits sont à 1 bit pour le signe, 8 bits pour l'exposant et 23 bits pour le numéro de la base (ou mantisse).Par défaut, Java traiter un nombre décimal (par exemple,"
4.3
") comme undouble
, sauf si vous spécifiez unfloat
par l'ajout d'un f après le nombre (par exemple,"4.3f
").Vous rencontrez le même problème sur les deux lignes. Tout d'abord, la virgule littérale est interprété comme un double par le compilateur. Il a ensuite tenté de l'attribuer à l'
b
, qui est de typefloat
. Depuis undouble
est de 64 bits et unfloat
n'est que de 32 bits (voir Java primitives de la documentation), Java vous donne un message d'erreur indiquant que lefloat
ne peut pas s'adapter à l'intérieur de ladouble
. La solution est d'ajouter un f à votre décimal littéraux.Si vous avez essayé de faire l'inverse (c'est à dire attribuer un
float
à undouble
), ce serait pas un problème puisque vous pouvez l'adapter à unefloat
's 32 bits dans undouble
s'64.Ne pas utiliser float. Il n'est presque jamais une bonne raison de l'utiliser et n'a pas été depuis plus d'une décennie. Utilisez simplement le double.
Pas. Chaque valeur ou variable a exactement un type (double, float, int, long, etc...). Le Java Langage De Spécification membres exactement ce qui se passe lorsque vous essayez d'attribuer une valeur d'un type à une variable d'un autre type. Généralement, les affectations d'une "petite" valeur à une "plus grande" type sont autorisés et effectués de manière implicite, mais les affectations où l'information pourrait être perdue, car le type de cible est trop "petit" pour contenir toutes les valeurs de l'origine ne sont pas autorisés par le compilateur, même si le béton est la valeur d'ajustement dans le type de cible.
C'est pourquoi le compilateur se plaint que l'attribution d'une valeur double (dont la traduction littérale est implicitement) à une variable de type float pourrait perdre des informations, et que vous avez à l'apaiser par une valeur d'un flotteur, ou par moulage explicitement.
Un secteur qui provoque souvent des confusions est calculs, parce que ce sont implicitement "élargie" de l'int pour des raisons techniques. Donc, si vous multipliez deux courts-métrages et tentez d'affecter le résultat à une courte, le compilateur va se plaindre parce que le résultat du calcul est un int.
float gamme est inférieur à double donc d'un flotteur peut être facilement représentées en double, mais l'inverse n'est pas possible parce que, disons-nous prendre une valeur qui est hors de flotteur de gamme, puis lors de la convention, nous allons perdre les données exactes