Oui Kioresse répond bien par contre ce n'est pas parce que le programme est très con qu'il faut utiliser des décimales pour avoir un résultat en décimales et je vais l'expliquer.
En fait il faut savoir que quand nous faisons des calculs nous utilisons le système décimal car c'est celui que nous avons appris. Mais c'est quelque chose qu'un ordinateur ne sait pas faire car il ne sait manipuler que des 1 et des 0 et il est donc obligé de convertir ces données en binaire pour pouvoir les traiter.
Mais du coup comment ça marche le binaire ?
Je ne suis pas sûr que le binaire soit quelque chose de très répandu alors je vais faire depuis le début. un nombre binaire est un nombre n'ayant pour chiffres que 0 et 1 raison pour laquelle 1 + 1 = 10 (dès qu'on rajoute 1 au chiffre de plus grande valeur on remet cette colonne à 0 et on rajoute 1 à la colone à gauche.
Du coup 10 + 10 = 100, 100 + 100 = 1000 et 11 + 1 = 100.
Pour convertir une valeur binaire en décimal il y a une astuce assez simple : on associe 1 au chiffre le plus à droite et à chaque autre chiffre on associe la valeur associée au chiffre à droite multipliée par 2. Ensuite on prend les valeurs associées à des 1 et on en fait la somme. Par exemple pour convertir 1001 on fait :
valeurs associées | 8 | 4 | 2 | 1 |
Nombre binaire | 1 | 0 | 0 | 1 |
Du coup on ne garde que 8 et 1 et leur somme fait 9. Donc 1001 en binaire vaut 9 en décimal. On constatera que si on peut multiplier par 2 dans un sens on peut aussi diviser par deux dans l'autre et qu'en prenant 110,1 :
valeurs associées | 4 | 2 | 1 | 0,5 |
Nombre binaire | 1 | 1 | 0 | 1 |
On garde 4, 2 et 0,5 ce qui donne 6,5.
Sauf que quand l'ordinateur traite des données qu'on lui donne ce n'est pas du binaire vers décimal qu'il fait mais du décimal vers du binaire. Du coup comment il fait ?
On fait dans le sens inverse. On crée notre tableau dont on arrange la taille pour qu'une valeur associée soit plus grande que le nombre qu'on veut convertir, mais qu'une seule. Puis on parcours le tableau de gauche à droite et à chaque fois qu'on trouve une valeur on la retire du nombre à convertir et on place un 1 là ou la valeur est associée. on s'arrête quand il reste 0. Par exemple pour 37 :
valeurs associées | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Nombre binaire | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
On ne prend pas 64 car trop grand mais on prend 32 et il nous reste 37 - 32 = 5.
On ne prend ni 16 ni 8 car trop grands mais on prend 4 et il nous reste 5 - 4 = 1.
Puis on ne prend pas 2 mais on prend 1 et il nous reste 1 - 1 = 0. On a trouvé ce qu'il fallait et 37 en décimal vaut 100101 en binaire.
Mais qu'en est-il de 1,3 ? voyons donc :
valeurs associées | 2 | 1 | 0,5 | 0,25 | 0,125 | 0,0625 | 0,03125 |
Nombre binaire | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
On ne prend pas 2 car trop grand mais on prend 1 et il nous reste 1,3 - 1 = 0,3.
On ne prend pas 0,5 car trop grand mais on prend 0,25 et il nous reste 0,3 - 0,25 = 0,05.
On ne prend ni 0,125 ni 0,625 car trop grands mais on prend 0,03125 et il nous reste 0,05 - 0,03125 = 0,001875.
Si vous avez bien suivi mon texte, vous vous demandez surement pourquoi je me suis arrêté avant d'avoir un reste de 0 comme dans mon exemple. La réponse est simple : l'équivalent binaire du décimal 1,3 est une série infinie de chiffres après la virgule et il est donc impossible d'en effectuer la conversion.
En fait à par des cas comme mon 5,5 plus haut la très très grande majorité des nombres décimaux ne passe pas la conversion en binaire.
Pourtant vous pouvez utiliser 0,3 sur votre ordinateur. Alors qu'est-ce qui se passe ?
En fait, il se trouve que pour contourner le problème tout en optimisant ses performances, on a séparé les nombres sous deux types auxquels correspondent deux conversions différentes l'int (integer) pour les entiers et le float pour les nombres décimaux (c'est à dire à virgule flottante).
Les int sont une simple conversion décimal binaire (avec une transformation pour faire des valeurs négatives mais c'est pas important que vous la connaissiez) et les décimales sont converties dans une structure plus complexe. Par exemple 1,3 sera écrit comme + 10**(-1)*13 (où le + sert à dire si c'est 1,3 ou -1,3 et le 10**(-1)*13 pour écrire 1,3 sous la forme de 13/10)
Bien sûr on pourrait n'utiliser que des float mais leur construction rend leur utilisation beaucoup plus lente.
Et c'est pour cette même question de performance qu'en informatique, un calcul n'impliquant que des int renvois un int et un calcul n'impliquant que des float renvois un float. Ne pensez surtout pas à faire un calcul impliquant un int et un float, il faudra que vous demandiez à votre machine de le convertir avant.
Cependant, ce n'est pas le cas de tous les langages. Ça l'est pour le C (et c'est pour ça que sur 2003, qui est en C, on ne manipule que des entiers) mais pas pour Ruby qui saura détecter qu'une formule comporte à la fois des int et des float et convertira automatiquement les int en float sans qu'on ai rien à lui dire.
Du coup en fait en remplaçant le 11 par un 11.0 vous dite implicitement que votre calcul comporte un float et que c'est un float que vous voulez
Au passage il y a mieux que de mettre la valeur de la variable en float, dans la mesure où ça ne sera pas très beau si vous l'affichez comme ça. En fait vous pouvez aussi faire un $game_variables[1] /= 2.0 pour la division et si vous afficher aussi ce 2 vous pouvez faire un ($game_variables[1]*1.0)/2
Du coup j'ai pas mal parlé mais je dois dire que je suis plutôt passionné par ce genre de choses ^^
Aussi :
- Kioresse a écrit:
- Pour les calcules:
Addition: +=
Soustraction: -=
etc...
Pour rendre une variable égale a une autre:
$game_variables[1] = $game_variables[2]
Pour les calcule, il suffit d'ajouter un signe devant le =
En espérant que cette solution réponde a tes besoin.
En fait la forme
$game_variables[1] = quelque chose écrase le contenu de ce qui est à gauche pour le donner la valeur de ce qui est à droite.
$game_variables[1] += quelquechose est une version simplifiée pour
$game_variables[1] = $game_variables[1] + quelque chose ou on remplace la valeur de la variable par sa valeur + quelque chose.