Quelle est la différence entre lancer sur `float` et append` f` comme suffixe lors de l’initialisation d’un `float`?

Quelle est la différence entre

float f = (float) 99.32 ; 

et

 float f = 99.32f ; 

Les deux ont été compilés et exécutés avec succès.

 float f = 99.32f ; 

C’est un littéral float , ce qui signifie qu’une variable float est directement affectée à une valeur float .

 float f = (float) 99.32 ; 

C’est une variable float à laquelle une valeur double est envoyée pour être float avant d’être affectée.

La différence peut être optimisée, mais dans le premier cas, vous avez un double littéral qui est converti en un flottant alors que vous avez un littéral flottant dans le second cas.

Si vous n’êtes pas optimisé, vous obtenez un transtypage dans le code du deuxième exemple.

Cependant, il existe des cas en coin où le résultat pourrait (selon le mode d’arrondi) être légèrement différent. Si votre nombre ne peut pas être exactement représenté, dans le premier cas, vous arrondissez deux fois – d’abord lorsque vous arrondissez la représentation décimale à un double et que vous arrondissez ensuite la valeur décimale directement au premier. à un flotteur.

Dans le premier cas sans la dissortingbution 99.32 est interprété comme double pas comme un flotteur.

Un double littéral est lancé pour flotter.

Dans le second cas, vous avez le suffixe f pour vous assurer que le compilateur traite 99.32 comme un flottant.

Dans la ligne float f = (float) 99.32; le littéral 99.32 est créé par défaut en double type et est ensuite converti en un float .

Dans la ligne float f = 99.32f ; le littéral est créé en tant que type float raison de la fin de f dans 99.32f et aucune 99.32f type n’est requirejse.

Ce dernier serait analogue à l’écriture double f = 99.32; comme vous avez un type double assigné directement à une variable de type correspondant.

Les littéraux à virgule flottante sans suffixe sont par défaut de type double .

Ainsi, en déclarant float f = (float) 99.32; vous commencez par transtyper explicitement le littéral 99.32 qui est du type double à un float , puis l’affectez à la variable f .

float f = 99.32; déclarant float f = 99.32; fait la même chose mais dans ce cas la conversion entre types est faite implicitement.

Si vous voulez éviter la conversion implicite, vous devez utiliser le suffixe f pour définir votre littéral (par exemple, float f = 99.32f; )

La différence est que le littéral 99.32 est de type double, tandis que le littéral 99.32f est de type float.

La première instruction assigne le littéral float à une variable float. Rien de spécial.

La seconde instruction jette un double littéral sur un flottant et affecte le résultat à une variable flottante.

En ce qui concerne la norme, vous pouvez atsortingbuer un double littéral à une variable flottante sans la transtyper explicitement. Dans ce cas, la dissortingbution implicite se produit. Par exemple :

 float f = 99.32; 

Vous pouvez même faire:

 float f = (double) 10.5f; 

et le côté droit est toujours implicitement converti en flotteur.

S’il vous plaît noter que la plupart des compilateurs modernes optimisent ceux loin, donc la représentation des flotteurs est généralement une question de style et de préférence. Soyez juste cohérent.