C’était une remarque faite sur Slashdot en mars dernier par un certain jimbojw, au sein d’une discussion sur le sens profond de 4 x 4,0 [1].
Suite à une remarque pertinente que "4"
était en fait une chaîne de caractère dont la multiplication n’avait pas un sens immédiat, Jim a fait le test avec plusieurs langages :
"4" * 4.0
donne :
- En Ruby :
"4444"
- En PHP et Javascript :
16
- En Java :
Exception:The operator * is undefined for the argument type(s) String, double
Et tant qu’il y était, il a testé l’addition :
"4" + 4.0
donne :
- En Ruby :
TypeError: can't convert Float into String
- En PHP :
8
- En JavaScript :
44
- En Java :
"44.0"
“Which I just find amusing all around” ajoute-t-il...
Effectivement, on se demande pourquoi Ruby, qui a défini l’opérateur * pour répéter des chaînes (une convention acceptable) n’en a pas profité pour faire de même avec +. En fait, si, c’est ce qu’il essaie de faire, mais manifestement la routine de conversion du décimal 4,0 en chaîne n’a pas de chaîne de formatage par défaut (l’utilisateur veut-il voir "4"
,"4.0"
,"4,000"
,"00004,0000"
... ?), ce qui personnellement me semble un peu dommage ; mais j’ai déjà assez pesté contre les conversions automatiques parfois cavalières de nombres en chaînes et vice-versa par Oracle (d’ailleurs je parie qu’Oracle aurait donné respectivement les nombres 16 et 8.)
Le Java, lui, semble connaître un formatage par défaut (peut-être comme Oracle dépendant de la configuration du serveur, du client ou de la session, au choix). Par contre le * n’a pas été défini pour les chaînes. Le PHP fait de la conversion en chiffres à la volée, j’ai toujours trouvé assez perturbant son typage très flou. Quant au Javascript, qui règne dans les mêmes sphères web que PHP, il semble inconsistant entre les deux opérateurs, puisque le * opère une conversion de la chaîne en nombre et la multiplication, alors que le + opère une conversion du nombre en chaîne et une concaténation ! Passer de PHP à JS régulièrement doit être assez buggatoire...
Notes
[1] Le degré de signification des deux n’est pas le même, le premier n’a qu’une décimale significative (en fait, il vaut entre 3 et 5...), donc pour un ingénieur le résultat n’est pas 16, plutôt l’arrondi 2.10¹ (soit une valeur entre 10 et 30) - sauf à être certain que ce premier 4 n’est pas une mesure mais une valeur absolue d’une précision aussi infinie que π, auquel cas on obtient bien 1,6.10¹. Comme le disait un autre contributeur, dans certains domaines, la différence entre 4,00 cm et 4,00000000 cm est de plusieurs centaines de dollars.
3 réactions
1 De Miod - 24/10/2007, 21:53
Je suis très surpris que tu n'aies pas essayé ces manipulations avec Perl.
2 De Eric C. - 25/10/2007, 11:50
En Perl ça donne les mêmes résultats qu'en PHP : 16 et 8
Logique pour un langage aussi peu typé. Pas rigoureux, mais bien pratique :)
3 De Jim R. Wilson - 25/10/2007, 23:58
PHP borrows its '.' for concatenation and '+' for numeric addition concepts from Perl - so it should be pretty much the same.
Regards,
-- Jim (jimbojw)