Plusieurs sortes de nombres…
Dans le programme précédent, vous pouvez essayer de changer le type de a en flottant, et de mettre une valeur non-entière (comme 3.1 par exemple). Si vous essayez de compiler votre code, vous aurez une erreur affichée en rouge dans la fenêtre du bas :
main.vala:5.11-5.17: error: Assignment: Cannot convert from `double' to `float'. C'est un problème particulier, lié à la précision des nombres décimaux. Par défaut, Vala les considère comme des nombres à double précision, donc du type
double.
Mais ici, vous tentez de stocker cette valeur dans un
float. Il y a donc une perte d'informations potentielle, et Vala juge bon de vous prévenir. Pour que votre programme compile, vous devez confirmer que c'est bien un flottant que vous voulez. Pour cela, deux solutions :
Code : Vala | float a = (float) 3.1; /* On rajoute un (float) entre le nombre et le = */
float a = 3.1f;
|
Et ainsi votre programme compilera.
Passons aux opérations. Les nombres supportent toutes les opérations usuelles, telles que l'addition (+), la soustraction (-), la multiplication (*) et la division (/). Naturellement, si on additionne, soustrait ou multiplie deux entiers, on récupère un entier. En Vala, c'est également vrai pour la division : 46/3 sera, sans indication particulière, évalué comme l'entier 15 (pourtant, si vous faites le calcul à la main...). Vous pouvez vous en convaincre en exécutant le programme suivant :
Code : Vala 1
2
3
4
5
6
7
8
9
10
11
12 | public class Main
{
public static int main (string[] args)
{
int a = 3;
int b = 46;
stdout.printf("%f", b/a);
return 0;
}
}
|
Même avec l'instruction de formatage
"%f"
, Vala convertit votre entier en flottant, mais seulement après la division (donc quand le reste a déjà été perdu). Vous devez lui préciser que vous souhaitez le résultat décimal en réalisant ce que l'on appelle un
transtypage (
cast en Anglais). En fait, cela revient exactement au même que ce que nous avons fait juste au dessus : il faut encore une fois préciser que c'est un flottant que vous attendez. Mais cette fois-ci, la seule possibilité est de le faire à l'aide du mot
float. Le programme devient alors
Code : Vala 1
2
3
4
5
6
7
8
9
10
11
12 | public class Main
{
public static int main (string[] args)
{
int a = 3;
int b = 46;
stdout.printf("%f", (float) b/a);
return 0;
}
}
|
Ainsi, c'est bien un décimal qui sera calculé.
Autres conversions
Parfois, d'autres conversions de types sont souhaitables, par exemple passer d'une chaîne à un nombre, ou vice-versa. Dans ce cas, on utilise des méthodes proposées par les objets à convertir : par exemple, pour convertir un entier
a en chaîne, on écrira
a.to_str(). Naturellement,
ceci ne modifie pas la variable a : il est interdit pour une variable de changer de type !
Cela renvoie en fait une nouvelle valeur, que l'on peut stocker dans une variable ou utiliser directement. Les chaînes de caractères supportent quant à elles les méthodes
to_int et
to_double pour réaliser vos conversions. Par exemple on peut écrire :
Code : Vala | string a = "43";
stdout.printf("a = %d", a.to_int() - 1);
|
Nous reverrons ces conversions plus tard.