Page 1 sur 1

Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 10:52
par scanab
La fonction round() effectue un ceil() au lieu d'un arrondi.
Il est facile de le vérifier avec le testeur d'expression dans le module scénario.
Lorsque l'on teste l’expression

Code : Tout sélectionner

round(1.1,0)
le résultat est
2
alors que le résultat attendu est 1...

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 11:32
par loic
Bonjour,
C'est une fonction php pas jeedom, voila la documentation http://php.net/manual/fr/function.round.php

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 12:13
par scanab
Il doit bien y avoir un soucis quand même...
Si je prends le 1er exemple du lien que tu donne

Code : Tout sélectionner

<?php
echo round(3.4);         // 3
[...]
?>
voici le résultats dans l'évaluateur d'expression de jeedom :

Code : Tout sélectionner

round(3.4) = 4

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 13:55
par scanab
Après investigation le problème est dans la fonction round($_value, $_decimal = 0) du fichier scenarioExpression.class.php

Code : Tout sélectionner

		if ($_decimal == 0) {
			return ceil(floatval(str_replace(',', '.', $result)));
		} else {
			return round(floatval(str_replace(',', '.', $result)), $_decimal);
		}
Je ne comprends vraiment pas l’intérêt de ce test... d'autant plus qu'il renvoie un résultat potentiellement faux si on veux un arrondi à l'unité... Pour moi, il devrait juste y avoir

Code : Tout sélectionner

			return round(floatval(str_replace(',', '.', $result)), $_decimal);

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 14:44
par loic
Alors je sais pas ça a du être une demande d'un utilisateur ou fait par quelqu'un en pr je sais pas du tout. Pour moi il n'y avait pas de fonction round dans jeedom même car pas d’intérêt.

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 15:55
par scanab
loic a écrit :
21 déc. 2018, 14:44
Alors je sais pas ça a du être une demande d'un utilisateur ou fait par quelqu'un en pr je sais pas du tout. Pour moi il n'y avait pas de fonction round dans jeedom même car pas d’intérêt.
Mais faudrait pas l'appeler round dans ce cas... C'est quand même bizarre de faire un round sauf quand on ne demande pas de décimales où dans ce cas on fait un ceil... Tu ne pense pas ?

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 16:09
par loic
Oui oui je suis 100% d'accord avec toi mais malheureusement je n'ai pas la motivation de faire le changement, ca va encore faire plein de sujet sur le forum car ya un changement qui impacte ceux qui se servent de la fonction.

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 16:21
par scanab
:lol:
Je te comprends...
Tu pourrait le faire autrement : pourquoi ne pas faire une autre fonction genre realRound() qui ferait vraiment un round ? Comme ça pas de régressions ! Avec bien sur de bons commentaires expliquant bien pourquoi chacune de ces fonctions existe :D

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 16:28
par scanab
et mieux encore, tu ajoute dans la fonction round() "originale" un message d'avertissement disant à l'utilisateur qu'il utilise une fonction dépréciée qui sera supprimée dans une future version...

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 16:30
par loic
Je doute que les utilisateurs le vois car ça serait dans les logs du scénario.... L'idéal ça serait juste de la supprimer cette fonction n'a aucun raison d'etre mais bon pas envie de gérer les retours

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 16:36
par scanab
OK, je pensais à un message jeedom dans l'interface...
Mais à minima, créer une fonction realRound() pour avoir au moins la possibilité d'avoir un arrondi réel, ce serait possible ?

Re: Résultat de la fonction round() erroné

Publié : 21 déc. 2018, 16:46
par loic
Je vais voir je préférais vraiment supprimer l'autre fonction en faite.

Re: Résultat de la fonction round() erroné

Publié : 22 déc. 2018, 15:47
par scanab
Je ne peux qu'etre d'accord avec toi :lol:

Re: Résultat de la fonction round() erroné

Publié : 03 févr. 2019, 18:51
par Swr
Bonjour,

J'utilise de + en + la fonction round() dans les messages vocaux pour informer d'une distance, temps.. mais le problème de l'arrondi supérieur est gênant.
Quid de la demande de scanab pour avoir une fonction realRound() ?
Quelqu’un a t'il trouvé une solution pour faire un arrondi ?

Re: Résultat de la fonction round() erroné

Publié : 05 févr. 2019, 11:17
par cadavor
J'avais relevé ce comportement il y a pas mal de temps déjà :
viewtopic.php?f=23&t=38942&p=639183

Re: Résultat de la fonction round() erroné

Publié : 11 févr. 2019, 20:53
par rjcb
Hello,

Je rebondi la dessus, alors comment faire pour avoir une seule décimale ?
J'avais l'habitude d'utiliser round mais appliqué a une division cela n'a pas l'aire de fonctionner ?
Screenshot 2019-02-11 at 20.50.28.png
Screenshot 2019-02-11 at 20.50.28.png (80.93 Kio) Consulté 699 fois
Screenshot 2019-02-11 at 20.50.02.png
Screenshot 2019-02-11 at 20.50.02.png (88.16 Kio) Consulté 699 fois
:P

Re: Résultat de la fonction round() erroné

Publié : 02 mars 2019, 19:01
par SBO
@rjcb la fonction bug et elle interprète le "/"

tu peux essayé en modifiant la fin de ton calcul par :

Code : Tout sélectionner

.......#)\/2),1)
Attention si un jour la fonction est corrigée dans le core, ton calcul pourrait ne plus fonctionner.

Re: Résultat de la fonction round() erroné

Publié : 03 mars 2019, 11:34
par loic
Bonjour,
Ca sera corrigé en 4.X

Re: Résultat de la fonction round() erroné

Publié : 18 mai 2019, 00:10
par fishes
Salut

Je sais pas si qqn l’a déjà évoqué mais il est possible de contourner l’arrondi mal réalisé par la fonction round sans pour autant créer une nouvelle fonction.

Perso je fais round(#value#-0.5,0)

Exemple si valeur = 52,4. Round retourne 53. Après application de la formule on obtient bien 52.

@+