On a plus de souplesse, me semble-t-il, qu'avec round, ceil et floor.
Le résultat est un float... qu'on peut arrondir par round()...
Commentaires prévus pour doxygen.
<?PHP
/**
arrondi($nombre,$niveau = 1, $mode =1 )
\author Michel Barthélémy Billard Sirakawa
\date novembre 2012
\param $nombre float à arrondir
\param $niveau valeur supérieure ou égale à 1: est multipliée par 4 pour créer le tableau des intervalles. Par défaut :1. testé jusqu'à 256...
\param $mode est le sens de l'arrondi: 1 2 ou 3. Par défaut 1.
\return un nombre float arrondi dans un encadrement plus ou moins étroit selon la valeur de $niveau
\par les valeurs de $niveau
\li La valeur 1 permet les arrondis à 0.25,0.50,0.75
\li La valeur 2 permet les arrondis à 0.125 près
\li La valeur 3 permet les arrondis à 0.833 près
\li La valeur 4 permet les arrondis à 0.625 près
\par les valeurs de $mode
\li1 arrondi supérieur
\li 2 arrondi inférieur
\li 3 arrondi médian
*/
function arrondi($nombre,$niveau = 1, $mode =1 )
{
$paliers = array();
$paliers[]=0;
$nb_valeurs = 4*$niveau;
$base = 1/$nb_valeurs;
for ($i = 0; $i <= $nb_valeurs; $i++)
{
$paliers[] = $base*$i;
}
$nb_paliers = count($paliers);
$entier = intval($nombre);
$decimal = $nombre - $entier;
$ajustement = 0;
$i =1;
$trouve = false;
while (($trouve === false) and ($i < $nb_paliers))
{
$v_min = $paliers[$i];
$v_max = $paliers[$i+1];
if (($decimal >= $v_min) and ($decimal < $v_max))
{
switch ($mode)
{
case 1:
$ajustement = $paliers[$i+1];
break;
case 2:
$ajustement = $paliers[$i];
break;
case 3:
$ajustement = ($paliers[$i]+ $paliers[$i+1]) / 2;
break;
}
$trouve = true;
}
$i++;
}
return $entier + $ajustement;
}
echo arrondi(9.95,16,2);
?>