Dans le Guide du Livre du SCJP de Kathy Sierra, dans le chapitre Affectations, nous apprenons que nous pouvons déclarer quelque chose comme celui-ci Maintenant, autre situation. Double peut inclure tous les octets contenus dans une valeur de flotteur car il s'agit d'un plus grand type de données. Alors pouvons-nous dire Pourquoi ces deux comportements contradictoires sont-ils là pour une mission de valeur littérale? En bref si octet b = 7; code>. Derrière la scène, le code est octet b = (octet) 7; code>. En effet, dans Java, le numéro 7 est considéré comme une valeur intégrale littérale afin de se lancer dans Int. P>
float f = 10.543; code> comme 10.543 est une petite valeur et doit correspondre à un flotteur. La valeur littérale de ce nombre est également considérée comme une double compilation afin de la jeter implicitement pour flotter. Mais ce n'est pas le cas, le compilateur nous arrête. Nous devons ajouter un f code> ou f code> après cette valeur. p>
octet b = 7 code> est possible. Pourquoi float f = 10.543 code> n'est pas possible? P>
5 Réponses :
une différence: p>
Vous pouvez lire JLS 5.2 Affectation Conversion
Le rétrécissement de la compilation des constantes signifie que le code tel que: p> blockQuote>
xxx pré> est autorisé. Sans le rétrécissement, le fait que le littéral entier 42 ait le type INT signifierait qu'un moulage à l'octet serait nécessaire: P> blockQuote>
xxx pré> Si le type de l'expression ne peut pas être converti au type de variable par une conversion autorisée dans un contexte d'affectation, une erreur de compilation se produit. P>
Si le type de la variable est float ou double, la conversion de la valeur de valeur (± 5,13) est appliquée à la valeur V p> blockQuote>
JLS # 3.10.2.Les littéraux à point de floiser p>
Un littéral à point flottant est de type float s'il est suffixé avec une lettre ASCII F ou F; Sinon, son type est double et peut éventuellement être suffixé avec une lettre ASCII D ou D P> blockquote>
5.1.2. Élargissement de la conversion primitive p>
Une conversion primitive de rétrécissement du double à float est régie par les règles d'arrondi de l'IEEE 754 (§4.2.4). Cette conversion peut perdre de la précision, mais aussi perdre la portée, entraînant un flotteur zéro d'un double double et un flotteur à l'infini d'un double fini. Une double Nan est convertie en une Nan à flotteur et une double infinité est convertie en une infini de flotteur identique. P> BlockQuote>
J'espère que ci-dessus clarifie votre doute. p> p>
L'attribution d'un double à un flotteur peut entraîner une perte de précision, alors Java vous dit que vous devez expliquer explicitement comment vous voulez qu'il effectue la mission. Tronquage simple peut entraîner des erreurs d'arrondi significatives. P>
Considérez qu'une décimale limitée dans la base 10 peut être une valeur fractionnelle illimitée dans la base binaire (Point de flottation par exemple). Faire la conversion entre types de points flottants explicites est donc une bonne règle de base, utile dans la grande majorité des cas. P>
Pour des types intégrés tels que l'octet, la situation est légèrement différente: les types intégrés ne peuvent différer que de leur taille, mais ils ont tous la même précision décimale, nulle. Il n'ya donc aucune ambiguïté dans l'attribution d'une valeur d'ajustement d'un type d'intégral plus important à une variable intégrée plus petite. P>
Pour ajouter aux réponses précédentes, la représentation réelle de 10.543 est la suivante: P>
float code>: 10.54300022125244140625 Li>
double code>: 10.5429999999999992610355548095 LI>
ul>
Puisque vous spécifiez deux numéros différents, il est logique de nécessiter une déclaration explicite. P>
On pourrait en dire autant pour l'octet et la représentation int.
Pas vraiment: avec (octet) 42 code> et (int) 42 code> vous stockez le même numéro i> dans deux représentation binaire différente. Avec 10.543f code> et 10.543 code> Vous spécifiez réellement deux numéros différents i>.
Bon sang..Ce est cool. Comment pouvons-nous trouver cette représentation réelle?
Les deux rangées de mes réponses sont cliquées et vous trouverez plus d'informations ici: Stackoverflow. com / questions / 7644699 / ...
"Derrière la scène, le code est d'octet b = (octet) 7". P> blockQuote>
Ce n'est pas correct. Voir JLS # 5.2 comme mentionné dans plusieurs autres réponses. Il est indiqué "une conversion primitive de rétrécissement peut être utilisée si le type de variable est d'octets, courts ou caractères, et la valeur de l'expression constante est représentable dans le type de variable." P>
rien de là sur un typast. p>
Parce que 10.543 est un double i> et les JLS ne permet pas i> pour cette conversion implicite (oui, c'est très précisément défini i>). Essayez
float f = 10.543f code>. Il n'a pas vraiment besoin d'être d'autre raison que "le dit JLS". Le raisonnement de ces décisions peut être disputé pour toute la journée.