[RESOLU] Problème conversion Single vers float

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Quetzal_coatl
Messages : 15
Inscription : 11 Juil 2021 16:58

[RESOLU] Problème conversion Single vers float

Message par Quetzal_coatl » 04 Nov 2021 14:16

Bonjour,

Je débute sur unity et je ne trouve pas comment utiliser une valeur. J'ai un objet qui est dans un canvas et je souhaite comparer son transform.localPosition.x à une autre valeur.

Cette valeur est toujours une valeur entière mais lorsque je tente de la convertir en int grâce à cette ligne :
Debug.Log($"value : {transform.localPosition.x}, int value : {(int) transform.localPosition.x}");

cela me renvoie : value : 8, int value : 7

Je ne comprend donc pas pourquoi cela change la valeur étant donné que (int) est censé arrondir la valeur sans rien faire d'autre.

Je me suis de plus rendu compte que transform.localPosition.x était une valeur de type Single (en utilisant la fonction .GetType()) et je pensais pouvoir la convertir en float (à l'aide de float.Parse(transform.localPosition.x)) puis en int dans une autre ligne mais j'obtiens l'erreur "error CS1503: Argument 1: cannot convert from 'float' to 'string'" lorsque j'utilise float.Parse() :/ .

De plus, je ne comprend pas bien comment marche les variables Single. Pour en créer une, j'ai vu qu'il fallait utiliser un f comme un float, j'ai donc créée une variable nommée value (Single value = 8f;) seulement, lorsque je compare transform.localPosition.x à la variable value ou à 8f directement, unity affiche False :pleur4: .

J'ai finalement tenté de convertir transform.localPosition.x en string puis de la comparer à "8" et cela m'affiche True :o .

Ma question est donc comment peut on convertir une variable single en float ? et pourquoi est ce que j'obtient ces différents résultats ?
Dernière édition par Quetzal_coatl le 04 Nov 2021 19:48, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Problème conversion Single vers float

Message par boubouk50 » 04 Nov 2021 16:04

Salut,

je ne pense pas que ce soit possible que ton Debug.Log () te renvoie cela.
Tu affiches un float, tu devrais avoir quelque chose comme:
value : 8.000000, int value : 7

Ensuite, si ton float est très proche de 8 mais légèrement en dessous, genre 7.99999999999, alors le Débug.log arrondit le résultat et t'affichera 8.0. Tu croiras donc qu'il dépasse 8, ce qui n'est pas le cas. Ensuite, en récupérant l'entier uniquement par un cast, il va le tronquer pour ne garder que la partie entière, qui est 7. Il te faut donc spécifier comment tu effectues le cast par des fonctions mathématiques existantes ci-dessous:

https://docs.unity3d.com/ScriptReferenc ... ToInt.html -> L'entier supérieur
https://docs.unity3d.com/ScriptReferenc ... ToInt.html -> L'entier inférieur
https://docs.unity3d.com/ScriptReferenc ... ToInt.html -> L'entier arrondi (milieu à 0.5)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Quetzal_coatl
Messages : 15
Inscription : 11 Juil 2021 16:58

Re: Problème conversion Single vers float

Message par Quetzal_coatl » 04 Nov 2021 19:39

boubouk50 a écrit :
04 Nov 2021 16:04
je ne pense pas que ce soit possible que ton Debug.Log () te renvoie cela.
Tu affiches un float, tu devrais avoir quelque chose comme:
value : 8.000000, int value : 7
Bonjour, et merci de votre réponse :)

Déjà, ma valeur n'est pas un float comme je le croyais mais un Single (je ne sais pas si ça change quelque chose) et vu qu'un single me paraissait ressembler à un float (tout les deux sont des nombres a virgule) je pensais qu'il existait une méthode de conversion simple mais je n'en ai pas trouvé. Faut-il donc impérativement arrondir la variable en int puis la transformer en float ? Et si oui comment fait on par exemple pour transformer une variable single de valeur 1.2 en un float de la même valeur ?

Ensuite, mon Débug.Log() renvoie bien 8 et non 8.00000, il arrondit peut être mais comment peut on donc afficher sa valeur exacte ?

J'avais trouvé une solution temporaire qui était de de transformer cette valeur simple en string, (la string prend la valeur "8" sans tronquer)

En tout cas, merci de la solution du cast, je vais l'utiliser et je pense que je peux passer le sujet en résolu ::d

Edit : il me reste une derniere question : Quelle est la différence entre Mathf.RoundToInt() et Math.Round() ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU] Problème conversion Single vers float

Message par boubouk50 » 05 Nov 2021 09:25

Je ne connais pas le type single, je pense que c'est la précision qui ressort:
Float = Single precision.
Double = Double precision.
Un vector3 étant composé de 3 floats, transform.localPosition.x est un float, tu n'as pas a faire de cast de "Single" vers float. Il te faut comprendre ce qu'est un float, ou valeur flottante en français. Ce n'est pas un nombre fixe mais une valeur approximative qui peut varier légèrement, d'où l'impossibilité de la comparer avec un autre float. Pour une comparaison, il faut définir l'approximation ou utiliser une fonction de comparaison spécifique comme Mathf.Approximately (float, float).
Par exemple, si tu compares: 1f == 0.5f+0.5f le résultat sera false. Tu auras peut-être 1.000000001 == 0.999999999, ce qui est presque vrai mais ne l'est pas.

Concernant le Debug.log qui envoie 8 tout rond, je suis dubitatif. C'est un float, donc un nombre décimal, il devrait apparaître avec une virgule. Je n'ai pas le souvenir depuis les 8 ans que j'utilise Unity d'avoir jamais eu un entier sortir... Là, j'avoue je ne sais pas pourquoi tu as ce résultat, clairement.

Ensuite, la différence est quand même évidente, la documentation te le dis clairement autant que le nom de la fonction:
Round () renvoie un float, RoundToInt () renvoie un entier.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Quetzal_coatl
Messages : 15
Inscription : 11 Juil 2021 16:58

Re: [RESOLU] Problème conversion Single vers float

Message par Quetzal_coatl » 05 Nov 2021 17:47

Bonjour,

Merci pour cette réponse, je comprend mieux comment utiliser les float maintenant :super:
Pour le Debug.Log, il essaye peut être de raccourcir le résultat au maximum, quitte à renvoyer un float avec l'affichage d'un int, mais cela dépend peut être aussi de la version ou de l'affichage (j'ai peux être modifié un paramètre qu'il ne fallait pas :gene: )
boubouk50 a écrit :
05 Nov 2021 09:25
Float = Single precision.
Double = Double precision.
La seule chose que je ne comprend pas, c'est pourquoi Unity me renvoie le type single au lieu du type float car si single est sa précision, il ne devrait pas s'agir de son type non ? De plus, quand on créée un float sans mettre single ou double, de quelle précision est le float ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU] Problème conversion Single vers float

Message par boubouk50 » 05 Nov 2021 18:00

Je ne suis pas sûr et certain de ma réponse, mais il doit y avoir du vrai.
Je dirai qu'un single est un float. Un float dont la précision est calculée sur 32bits.
Un double est un float dont la précision est calculée sur 64bits.
Un decimal est un float dont la précision est calculée sur 128bits.

En gros: tu fais

Code : Tout sélectionner

float x = 0.1f;
tu castes implicitement ton float en single.
Si tu fais

Code : Tout sélectionner

float x = 0.1d;
tu castes implicitement ton float en double.

Donc un single est un float, mais un float n'est pas un single, puisqu'il peut avoir plusieurs précisions: Single, Double, Decimal.

La documentation officielle:
https://docs.microsoft.com/en-us/dotnet ... eric-types
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »