arrondi modulable

Mammouth du PHP | 2278 Messages

10 nov. 2012, 12:56

Ce bidulage est la généralisation d'une fonction écrite pour des besoins internes.
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);

?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD