Faire un arrondi par rapport à un pas [Résolu]

Signaler
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
-
Messages postés
6
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
16 décembre 2008
-
Bonjour,

dans une fonction je reçois un prix min et un prix max. je dois vérifier que le prix min correspond à un certain pas. Par exemple, que le prix soit un multiple de 0.50. Juste vérifier, avec un modulo, ça j'y arrive. Seulement j'aimerais obtenir le prix supérieur au prix min multiple de 0.50 pour cet exemple et inférieur à mon prix max.

Une idée

Espérer le meilleur
Prévoir le pire
A voir également:

9 réponses

Messages postés
195
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
24 octobre 2011
20
Le -0.5 fait partie de la formule.

Explication :
round() arrondit à l'entier le plus proche :
- de xxx.00 à xxx.4999999... : l'entier inferieur (ex. : 23.48 --> 23)
- de xxx.50 à xxx.9999999... : l'entier superieur (ex. : 23.52 --> 24)

max(val1,val2) renvoie la plus grande des 2 valeurs.
En faisant max(round(blabla)-0.5, round(blabla)) :
on est sûr de récupérer l'entier directement supérieur

Donc dans ton cas :
multiplié par le pas, ca donne la premiere valeur superieure au PrixMin.
C'est bien ce que tu veux. (CQFD)
Messages postés
195
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
24 octobre 2011
20
C'est un probleme mathematique !

PrixMin - PrixMax : la fourchette de prix
Pas : le pas (ici 0.5)
PrixMinRond : celui que tu sais deja calculer
(le premier multiple du Pas superieur a PrixMin)

PrixMaxRond =  le multiple du Pas directement inferieur a PrixMax,
il faut trouver X pour que :
PrixMinRond + X * Pas <= PrixMax

$Pas = 0.5;
$PrixMinRond = ...(ta formule pour le calculer);
$PrixMaxRond = $PrixMinRond;
$x = 0;
while (($PrixMinRond + $x * $Pas) <= $PrixMax) {
  $PrixMaxRond += $Pas;
  $x++;
}
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
1
Sauf que c'est justement le PrixMinRond que j'arrive pas à trouver. Moi je sait juste avec un modulo si le prix passé en paramètre est bon ou pas.

En fait, dans ma fonction je dois faire une boucle afin d'obtenir tous les prix entre le min et le max multiples du pas. Du coup, comme je fais un for, je n'ai pas besoin de calculer le max, mais il me faut quand même mon point de départ.

j'ai donc ça :

for($i=$min;$i<=$max;$i+=$pas){
      // mon traitement pour chaque prix
}

mais il me faut donc un $min qui aille

Espérer le meilleur
Prévoir le pire
Messages postés
195
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
24 octobre 2011
20
$PrixMinRond = $Pas * max(round(($PrixMin/$Pas)-0.5),round($PrixMin/$Pas));

$PrixRond = $PrixMinRond;
while($PrixRond<=$PrixMax){
      // traitement pour chaque prix
      // ...................
      // incrementation du prix
      $PrixRond += $Pas;
}
Messages postés
195
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
24 octobre 2011
20
Ou si tu preferes :



$min = $Pas * max(round(($PrixMin/$Pas)-0.5),round($PrixMin/$Pas));

for($i=$min; $i<=$max; $i+=$pas){
      // traitement pour chaque prix $i
      // ......................
}
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
1
Le -0.5 dans le premier round, c'est le pas ou sa fait partie de la formule ?

Espérer le meilleur
Prévoir le pire
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
1
Cool merci

Espérer le meilleur
Prévoir le pire
Messages postés
195
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
24 octobre 2011
20
CORRECTION !
la formule fausse ! (problème si PrixMin est un entier !)
round() est très pénible à basculer entre entier inférieur et entier supérieur !
(je me suis emmêlé les pinceaux ...)

Voila la formule qui fonctionne (testée) :
// ------------------
if (($Pas * round($PrixMin/$Pas))>= $PrixMin) {
    $PrixMinRond = ($Pas * round($PrixMin/$Pas));
} else {
    $PrixMinRond = ($Pas * round($PrixMin/$Pas))+$Pas;
}
// ------------------
Messages postés
6
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
16 décembre 2008

Pour 2 decimals:
-----------------

$pas=intval(100*$pas);
$prix_min=intval(100*$prix_min);
$prix=(intval(($prix_min+$pas-0.1)/$pas)*$pas)*1e-2;

Pour 0 decimals (entiers):
--------------------------

$prix=intval($prix_min+$pas-0.1)/$pas)*$pas;