- [Signets] Des ressources sur les tokens JWT
- [Réaction]Programmation orientée objet, qu'est-ce que c'est
Billet le bonjour à vous,
J’aimerai vous raconter l’histoire d’un programme avec lequel je me suis pris la tête avant de me rendre compte que le problème était entre la chaise et le clavier, et aussi un peu dans la tasse de café ☕ .
Voici à quoi ressemble le morceau de code qui a fait souffrir le rongeur que je suis.
jshell> double v0=1073741824000000000000000000000000000000.0;
v0 ==> 1.073741824E39
jshell> double v1 = v0 - 1.0;
v1 ==> 1.073741824E39
jshell> System.out.println("difference = "+(v0 - v1));
difference = 0.0
Je pense que vous aurez compris que je m’attendais à ce qu’à la ligne 8, la différence m’affiche la valeur 1.0
au lieu de 0.0
. Que nenni ! J’ai été trompé !
L’explication
En Java lorsqu’on dépasse une certaine valeur (comme c’est mon cas) le type double
n’est plus utilisable et pour ça, il faut utiliser le type BigDecimal
.
Cependant, on ne peut pas prendre comme choix par défaut dans tous nos programmes, le type BigDecimal
car les calculs avec ce dernier sont plus lent que ceux avec le type double
.
Sauf que quand vous êtes comme moi et que : 1. vous commencez à écrire votre programme en testant avec des petits nombres, 2. vous embarquez votre code dans un fonction qui semble bien faire le job, 3. le résultat de la fonction dépend de l’entrée utilisateur
Le résultat devient imprévisible.
Que fait la police le compilo ?
Ce que je ne comprend pas, c’est qu’en 2021, le compilateur ne sait pas me prévenir d’un tel danger et que la JVM ne lève aucune exception sur ce genre de cas (même mon éditeur préféré ne m’a rien remonté).
La variable du mauvais type (n’y voyez aucune jeu de mot) continue d’accepter une valeur qu’elle ne peut supporter et le seul moyen de se rendre compte du problème c’est d’avoir eu la lucidité de tester avec la valeur qui donne le mauvais résultat (sans planter le programme).
Souvenez-vous donc qu’en Java, le type double
(et int
d’ailleurs) ne passe pas à l’échelle, mais est trop timide pour nous l’avouer.
Maintenant j’en suis à me demander si ma banque utilise le bon type
de donnée quand elle calcule mes intérêts.
Et vous, comment c’est géré dans votre langage préféré ?