12.1 Opérateurs mathématiques |
See You Why? |
Nous venons de voir les fonctions sans paramètres et celles avec paramètres (unique ou multiples), celles avec instruction return et celles sans, les variables globales ou locales de JS. Jusqu'ici, peu d'opérations mathématiques ont été abordées, c'est donc l'occasion de combler [un peu] cette lacune.
Je n'oserai bien sûr pas vous faire l'affront de dire que :
l'addition se note '+' ;
la soustraction se note '-' ;
mais peut-être ignorez-vous qu'en JS,
la multiplication se note '*' ;
et
la division se note '/' ;
cette notation est d'ailleurs souvent utilisée, même sur les calculatrices les plus élémentaires.
Vous pourriez croire que ce chapitre est terminé si je ne vous rappelais pas l'opération 'modulo',
'modulo' signifie 'le reste de la division par...'
ainsi, 7 modulo 2 est 1, car le reste de la division de 7 par 2 est 1,
de même, 183 modulo 97 est 86, car le reste de la division de 183 par 97 est 86,
et l'opération modulo se note '%'...
donc, 183%97 = 86, car 183/97 = 1 reste 86 et
200%97 = 6, car 200/97 = 2 reste 6...
vous voici donc renseigné,
l'opération 'modulo' se note '%'...
fin de chapitre... quoi que...
Reste alors l'exponentiation... tout le monde se rappelle (ou devrait se rappeler) que 10 exposant 3 font 1000. Facile, il n'y a pas d'opérateur d'exponentiation en JS... mais il existe une méthode propre à l'objet Math qui permettra ces calculs d'exponentiation... rendez-vous au chapitre 34 où nous aborderons l'objet Math et ses méthodes.
Allez, juste pour les curieux :
var c = Math.pow(10,3);
donnera à c la valeur 1000, c'est-à-dire 10 exposant 3, parfois notée 103, 10^3 ou 10**3 selon les langages informatiques utilisés.
En présence de deux opérandes généralement de type number (mais on peut aussi avoir des booléens, des objets construits avec new Number, l'objet null, ou la valeur undefined), l'opérateur d'addition va effectuer la somme arithmétique des deux valeurs, après les avoir converties en nombres le cas échéant.
Le résultat de l'addition est de type number :
18 + 11 donnera 29.
En présence de deux opérandes généralement de type number (mais on peut aussi avoir des booléens, des objets construits avec new Number, l'objet null, ou la valeur undefined), l'opérateur de soustraction va retourner la différence arithmétique entre ces deux valeurs, après les avoir converties en nombres le cas échéant.
Si l'un des deux opérandes de l'opérateur - n'est pas de type number (ou convertibles dans ce type), l'opérateur renvoie NaN (not a number).
Le résultat de la soustraction est de type number :
18 - 11 donnera 7.
1. Opérateur de concaténation +
Si l'un des deux opérandes de l'opérateur + ne fait pas partie des types mentionnés ci-dessus, alors l'opérateur se comporte comme un opérateur de concaténation.
Ainsi, écrire
18 + "CUY" donnera "18CUY"
"18" + 11 + "7" donnera "18117"
2. Opérateurs unaires + et -
Les signes + et - peuvent aussi n'être employés qu'avec un seul opérande noté juste après ce signe. Dans ce cas, ils servent
soit à préciser si la valeur qui suit doit être un nombre positif ou négatif,
soit à conserver ou changer le signe de la valeur qui suit.
Ainsi, écrire
+18 donnera la valeur 18
-11 donnera la valeur 11 en négatif
-a donnera 17 si a valait -17
3. Opérateur unaire + pour conversion en nombre
Le signe + peut être placé devant une chaine de caractères pour forcer la convertion de cette chaine en valeur numérique (comme le ferait la fonction Number()) et forcer les + suivants à additionner plutôt que de concaténer.
Ainsi écrire
+"18" + 11 + +"7" donnera 36... voyez la différence avec notre exemple de la remarque n° 1.
En présence de deux opérandes généralement de type number (mais on peut aussi avoir des booléens, des objets construits avec new Number, l'objet null, ou la valeur undefined), l'opérateur de multiplication va effectuer le produit arithmétique des deux valeurs, après les avoir converties en nombres le cas échéant.
Le résultat de la multiplication est de type number :
18 * 11 donnera 198.
En présence de deux opérandes généralement de type number (mais on peut aussi avoir des booléens, des objets construits avec new Number, l'objet null, ou la valeur undefined), l'opérateur de division va effectuer le quotient arithmétique des deux valeurs, après les avoir converties en nombres le cas échéant.
Le résultat de la division est de type number :
18 / 11 donnera 1,636363... mais avec un point décimal, donc 1.636363...
1. NaN pour * et /
Si l'un des deux opérandes n'est pas du type number (soit au départ, soit qu'aucune conversion n'a été possible), le produit ou le quotient renvoyé sera aussi déclaré NaN (not a number).
2. Division par zéro
Selon ses souvenirs, le lecteur se rappellera soit que l'on ne peut jamais diviser par zéro, soit que la division d'un réel non nul par zéro retourne un infini, ∞. Les navigateurs habituels qui interprètent le JS accepte pour la plupart que la division d'un nombre non nul par zéro est possible et donne la valeur Infinity (∞) sans générer d'erreur. Merci JS.
3. Autres cas particuliers de la division
JS n'a pas été conçu comme logiciel scientifique, cependant JS accepte de traiter partiellement certains cas particuliers de la division, généralement refusés par les calculatrices.
En effet,
si a!0, la division de tout nombre a (non nul) par Infinity donne 0 ;
et la division de tout nombre a (non nul) par 0 donne la valeur Infinity ;
mais Infinity/Infinity retourne NaN ;
et 0/0 retourne NaN.
Vous ne voudriez pas que JS relève ces cas d'indétermination étudiés pendant votre enseignement secondaire...
4. / employé comme délimiteur dans les expressions régulières
On se rappellera les expressions régulières vues au chapitre 5. Une des façons d'encadrer une expression régulière est l'emploi des slashs. Le slash est malheureusement aussi la notation de l'opérateur de la division.
En cas de confusion possible, JS préférera considérer le slash comme notation de division, avant de le considérer comme délimiteur d'expression régulière... il faut en tenir compte...
Encore un opérateur unaire, c-à-d qu'il ne sera accompagné que d'un seul opérande.
Écrire a++, c'est comme écrire a=a+1.
C'est vouloir que la variable a augmente d'une unité, ou que sa nouvelle valeur soit égale à l'ancienne valeur augmentée de 'un' ou qu'elle s'incrémente.
1. a++ ou ++a
Les deux notations sont correctes, mais n'assurent pas le même résultat.
Si l'opérateur apparaît avant la variable, la valeur est modifiée avant l'expression est évaluée.
Si l'opérateur apparaît après la variable, la valeur est modifiée après l'expression est évaluée.
En d'autres termes,
étant donné j = ++k , la valeur de j est la valeur d'origine du k plus un ;
étant donné j = k++ , la valeur de j est la valeur initiale de k , puis k sera incrémentée après que sa valeur soit assignée à j .
Frère jumeau de l'opérateur ++, c'est aussi un opérateur unaire, c-à-d qu'il ne sera accompagné que d'un seul opérande.
Écrire a--, c'est comme écrire a=a-1.
C'est vouloir que la variable a diminue d'une unité, ou que sa nouvelle valeur soit égale à l'ancienne valeur diminuée de 'un' ou qu'elle se décrémente.
1. a-- ou --a
Les deux notations sont correctes, mais n'assurent pas le même résultat. Voir ++ ci-dessus.
En présence de deux opérandes généralement de type number (mais on peut aussi avoir des booléens, des objets construits avec new Number, l'objet null, ou la valeur undefined), l'opérateur %, aussi appelé modulo, va retourner le reste de la division du premier opérande par le deuxième opérande, après les avoir converties en nombre le cas échéant.
Le résultat de l'opération modulo est de type number :
18 % 11 donnera 7, car 18/11 donne 1 avec un reste de 7.
1. opérandes, entiers positifs ?
L'usage habituel de l'opérateur % est de travailler avec deux entiers positifs, mais l'opérateur % accepte aussi et sans problème des nombres non-entiers et/ou négatifs pour les deux opérandes. Dans ce cas, on observera souvent des problèmes de précision.
4 % 1.6 donnera 0.8, car 4 / 1.6 donne 2, reste 0.8 : 4 = 1.6 * 2 + 0.8
10 % 3 donnera 1, car 10 / 3 donne 3, reste 1 : 10 = 3 * 3 + 1
-10 % 3 donnera -1, car -10 / 3 donne -3, reste -1 : -10 = 3 * (-3) + (-1)
Nous déconseillons cependant cet usage avec JS, les résultats n'étant parfois pas conformes aux théories mathématiques.
2. % utilisé avec des chiffres hexadécimaux
L'usage habituel de l'opérateur % est bien l'utilisation décrite ci-dessus. Cependant, il n'est pas rare de faire usage du % pour crypter ou camouffler des URL... prudence donc si vous voulez faire appel à ces deux usages dans une même page de votre site.
http://%77%77%77%2e%67%6f%6f%67%6c%65%2e%63%6f%6d
ou encore
%68%74%74%70%3a%2f%2f%63%75%79%2e%62%65%2f%63%6f%75%72%73%2f%63%70%74%61%2f%65%78%6f%2f%65%78%31%38%31%31%2e%68%74%6d%6c
Dans ce cas, chaque % suivi de deux chiffres hexadécimaux représente un caractère %61 (ou 97 en décimal) pour a, %61 (ou 98d) pour b, %62 pour c... %6f pour o, %70 pour p... %74 pour t...
Vous voulez en savoir plus, allez voir les codes ASCII donnés ici, mais malheureusement en valeur décimale, mais pas en valeur hexadécimale... bon amusement.
En présence de deux opérandes, l'opérateur '=' indique qu'il faut calculer la valeur de l'expression située à droite du signe '=' et l'affecter à la variable située à sa gauche.
Rappelons ici que '=' ne signifie pas 'est égal à', mais bien 'prend la valeur de'.
1. affectation pas uniquement mathématique
L'affectation n'est pas qu'un opérateur mathématique. L'opérateur est applicable à des variables logiques (ou booléennes), string (ou chaine de caractères), mathématiques (évidemment), tableaux (ou arrays) et autres objets...
L'opérateur '=' n'est pas le seul opérateur d'affectation que JS connaisse. Voici quelques uns de ces opérateurs :
op | écrire | revient à écrire | et signifie |
+= | a += 2; | a = a + 2; | augmenter de 2 la valeur de a |
-= | a -= 7; | a = a - 7; | diminuer de 7 la valeur de a |
*= | a *= 10; | a = a * 10; | multiplier par 10 la valeur de a |
/= | a /= 40.3399; | a = a/40.3399; | diviser par 40.3399 la valeur de a |
%= | a %= 97; | a = a%97; | remplacer a par la valeur de a modulo 97 |
Il existe encore bien d'autres propriétés et méthodes de l'objet Math. À défaut d'informations suffisantes pour l'instant, nous les négligerons ici, mais nous y reviendrons au chapitre 34, où nous aborderons :
// les arrondis : en dessous, au plus proche, au dessus
et bien d'autres.
Math.floor(...)
Math.round(...)
Math.ceil(...)
// de l'aléatoire : un nombre entre 0 et 1
Math.random()
// de la géométrie : la valeur de Pi
Math.PI
//
voir suite >>>
voir suite >>>
voir suite >>>