Comportement bizarre de la fonction round

Bonjour ,

Je désire faire la moyenne de deux températures et arrondir a 1 décimal dans un scénario.
Dans le testeur d’expression:

 ( (#[Rez de chaussé][25 - Oeil Couloir][Température]# + #[étage][3 - oeil mezzanine][Température]# ) / 2.0 ) 

donne

Je vais évaluer : ( (17.6 + 17.3 ) / 2.0 )
Résultat : 17.450000000000003

et quand je rajoute la fonction round

round(  ( (#[Rez de chaussé][25 - Oeil Couloir][Température]# + #[étage][3 - oeil mezzanine][Température]# ) / 2.0 ) , 1)

donne

    Attention : il doit y avoir un souci, car le résultat est le même que l'expression
    Je vais évaluer : 26.3
    Résultat : 26.3

En mettant ces expressions directement dans un scenario j’ai le même comportement.
les 2 valeurs viennent du plugin zwave-js et mon jeedom est en version 4.4.19

Pourquoi ? Quelqu’un à un idée …

merci d’avance

Bonjour,
Il y a trop de parenthèses imbriquées.
Essayez avec :

round( 17.6 / 2.0 + 17.3 / 2.0 ,1)

26.3 = round(17.6 + 17.3 / 2 ,1)

Super, cela à l’air de fonctionner !

avec mes commandes cela donne

round( #[Rez de chaussé][25 - Oeil Couloir][Température]# / 2  + #[étage][3 - oeil mezzanine][Température]# / 2  , 1 ) 

C’est vrai que dans mes expression il y a un niveau de parenthèses d’inutile que j’avais rajouter pour en faisant des tests.

Donc il ne faut pas de parenthèses dans le 1er argument de la fonction round ?

merci :slightly_smiling_face:

Bonjour,

Ce n’est pas un problème de parenthèses pour la première expression :
image
Voilà l’explication :

Vous pouvez utiliser la fonction avg :
image
https://doc.jeedom.com/fr_FR/core/4.4/scenario#Les%20fonctions%20mathématiques

Salut,

Alors ça ne règle pas directement ton problème d’arrondi mais il existe une fonction pour calculer la moyenne, ça t’évite des paranthèses de l’utiliser plutot que de diviser par 2.

Que donne le résultat de la formule suivante ?

round(avg(#[Rez de chaussé][25 - Oeil Couloir][Température]#,#[étage][3 - oeil mezzanine][Température]#),1)

Oui il ne faut pas oublier le codage interne des nombres :rofl:
çà explique le … 00000000003

La fonction avg est aussi une solution, merci.

mais je pense que cela n’explique pas
image

alors que
image
fonctionne

ou encore

( 1.0 / 2.0 ) * ( 17.6 + 17.3 )    

Je vais évaluer : ( 1.0 / 2.0 ) * ( 17.6 + 17.3 )
Résultat : 17.450000000000003

qui donne la bonne moyenne ( avec le …0003 du au codage )

mais

round(  ( 1.0 / 2.0 ) * ( 17.6 + 17.3 )     , 1 )

 Attention : il doit y avoir un souci, car le résultat est le même que l'expression
 Je vais évaluer : round( 1.0 / 2.0 * ( 17.6 + 17.3 ) , 1 )
 Résultat : round( 1.0 / 2.0 * ( 17.6 + 17.3 ) , 1 )

:upside_down_face:

kaamelott-karadoc

1 « J'aime »

Bonjour,

Ce n’est pas un pb avec la fonction round. Ca ne fonctionne pas non plus avec floor, ceil … :
image

C’est un pb de parenthèses avec le testeur d’expression qui lorsqu’on lui demande de calculer:
round( (17.6 + 17.3) / 2.0 ,1) = 17.5 calcule: round( 17.6 + 17.3/2.0 ,1) = 26.3

Bonjour,

Pareil dans les scenario, je viens de faire un test rapide avec un scenario qui fait juste un log

Visiblement a l’intérieur d’une fonction on ne peut pas utiliser de parenthèses
sauf pour l’appel d’une autre fonction.

round(  ( 1.0 / 2.0 ) * ( 17.6 + 17.3 )     , 1 )

    Attention : il doit y avoir un souci, car le résultat est le même que l'expression
    Je vais évaluer : round( 1.0 / 2.0 * ( 17.6 + 17.3 ) , 1 )
    Résultat : round( 1.0 / 2.0 * ( 17.6 + 17.3 ) , 1 )

il supprime le 1er bloc de () mais pas le 2eme, l’analyse de l’expression après doit être KO et il rend l’expression après le 1er traitement

si on entour 17.6 + 17.3 par un appel a round (qui ne modifie pas la valeur) soit round(17.6 + 17.3 , 1 )

round(  ( 1.0 / 2.0 ) * round( 17.6 + 17.3 , 1 )     , 1 )

    Attention : il doit y avoir un souci, car le résultat est le même que l'expression
    Je vais évaluer : 17.5
    Résultat : 17.5

cela fonctionne. On peut supposer qu’il supprime toujours le 1er bloc de () et calcul
round( 1.0 / 2.0 * round( 17.6 + 17.3 , 1 ) , 1 ) qui fonctionne aussi.

En remplaçant tous les bloc de () par des appel a round
(qui ne modifie pas la valeur, juste pour avoir que des appel de fonction dans une fonction )

round(  round( 1.0 / 2.0 , 1 ) * round( 17.6 + 17.3 , 1  )     , 1 )

    Attention : il doit y avoir un souci, car le résultat est le même que l'expression
    Je vais évaluer : 17.5
    Résultat : 17.5

Pour moi la conclusion c’est ne pas utiliser de parenthèses dans l’argument d’appel d’une fonction sauf en cas d’appel d’une autre fonction

Et si c’est vraiment compliqué d’enlever les parenthèses dans le premier argument, on peut utiliser floatval()
round( floatval(17.6 + 17.3) / 2.0 ,1)

oh c’est juste pour mieux cerner le problème… la fonction avg fera l’affaire dans mon cas.

je viens de tomber d’ailleurs sur un post similaire:
https://community.jeedom.com/t/scenarios-bug-calcul-dexpression/84454

merci pour la réponse en tout cas :slightly_smiling_face: