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.