Faire un arrondi par rapport à un pas

Résolu
DarkCid Messages postés 195 Date d'inscription mardi 22 février 2005 Statut Membre Dernière intervention 26 octobre 2009 - 2 sept. 2008 à 11:16
Stanel Messages postés 6 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 16 décembre 2008 - 3 sept. 2008 à 19:35
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

jreaux62 Messages postés 195 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 24 octobre 2011 32
2 sept. 2008 à 17:08
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)
3
jreaux62 Messages postés 195 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 24 octobre 2011 32
2 sept. 2008 à 11:43
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++;
}
0
DarkCid Messages postés 195 Date d'inscription mardi 22 février 2005 Statut Membre Dernière intervention 26 octobre 2009 1
2 sept. 2008 à 11:49
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
0
jreaux62 Messages postés 195 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 24 octobre 2011 32
2 sept. 2008 à 14:32
$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;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jreaux62 Messages postés 195 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 24 octobre 2011 32
2 sept. 2008 à 14:36
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
      // ......................
}
0
DarkCid Messages postés 195 Date d'inscription mardi 22 février 2005 Statut Membre Dernière intervention 26 octobre 2009 1
2 sept. 2008 à 14:36
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
0
DarkCid Messages postés 195 Date d'inscription mardi 22 février 2005 Statut Membre Dernière intervention 26 octobre 2009 1
2 sept. 2008 à 17:13
Cool merci

Espérer le meilleur
Prévoir le pire
0
jreaux62 Messages postés 195 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 24 octobre 2011 32
2 sept. 2008 à 19:26
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;
}
// ------------------
0
Stanel Messages postés 6 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 16 décembre 2008
3 sept. 2008 à 19:35
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;
0
Rejoignez-nous