Erreur de calcul dans un scénario

Alors bonjour, désolé.
Voici une erreur de calcul détectée dans ce scénario :


Résultat, log du scénario :

[2024-05-26 22:07:00][SCENARIO] Lancement du scénario en mode synchrone
[2024-05-26 22:07:00][SCENARIO] **-- Début :** Scénario lancé manuellement.
[2024-05-26 22:07:00][SCENARIO] - Exécution du sous-élément de type [action] : action
[2024-05-26 22:07:00][SCENARIO] Affectation de la variable test1 => 5.6843418860808E-14 ((203.84+178.36-382.2)) 
[2024-05-26 22:07:00][SCENARIO] Exécution d'un bloc élément : 1207 
[2024-05-26 22:07:00][SCENARIO] Affectation de la variable test2 => 5.6843418860808E-14+34 (5.6843418860808E-14+34) 
[2024-05-26 22:07:00][SCENARIO] Fin correcte du scénario

La variable test1 devrait être égale à 0 et pas à 5.6843418860808E-14
Et la variable test2 devrait être égale à 34 et pas à 5.6843418860808E-14+34

Qu’en pensez vous ?

Bonjour @eljano

Il n’est pas interdit de dire bonjour, de faire des vraies phrases et de poser des questions.

Tu es sur un forum fréquenté par des humains, ce n’est pas chatGPT :wink:

1 « J'aime »

Salut,

Ah oui … c’est chaud ce bug :crazy_face:

image

Edit :
C’est très amusant quand on creuse :slight_smile:
image

image

image

Il doit y avoir une veille explication de type passage en binaire puis d’arrondi quelque part … reste à trouver l’explication exacte

2 « J'aime »

Le problème c’est que dans mon exemple la variable test2 a l’air de devenir une chaîne de caractères et non plus un nombre…

Bonsoir.

Testez ainsi :
(203.84+178.36)-382.2

Ah voilà, j’ai l’explication …

https://www.php.net/manual/fr/language.types.float.php

Aussi, les nombres rationnels exactement représentables sous forme de nombre à virgule flottante en base 10, comme 0.1 ou 0.7 , n’ont pas de représentation exacte comme nombres à virgule flottante en base 2, utilisée en interne, et ce quelle que soit la taille de la mantisse. De ce fait, ils ne peuvent être convertis sans une petite perte de précision. Ceci peut mener à des résultats confus: par exemple, floor((0.1+0.7)*10) retournera normalement 7 au lieu de 8 attendu, car la représentation interne sera quelque chose comme 7.9999999999999991118... .

1 « J'aime »

ça donnera la même chose Fabrice.

Faut faire un round donc pas exemple round(203.84+178.36-382.2,2) histoire de conserver 2 chiffres après la virgules au besoin suivant les chiffres …

3 « J'aime »

Excellente idée, Bison, ça marche !

1 « J'aime »

autre technique que j’ai appliqué dans certain de mes widget, c’est de multiplier par 100 si il y a 2 décimales, 1000 pour 3 décimales …

(203.84*100+178.36*100-382.2*100)/100 → 0

1 « J'aime »

Mais c’est une ruse de Bison futé ça :crazy_face::smile:

3 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.