web-dev-qa-db-fra.com

Arrondir à la fraction la plus proche (demi, quart, etc.)

Donc, je dois créer les fonctions suivantes, mais ma tête ne peut penser à aucune possibilité dans PHP sans calculs compliqués.

  • Arrondir toujours jusqu'à la décimale la plus proche (1,81 = 1,90, 1,89 = 1,90, 1,85 = 1,90)
  • Arrondir toujours jusqu'à la décimale la plus proche (1,81 = 1,80, 1,89 = 1,80, 1,85 = 1,80)
  • Arrondir toujours au x.25/x.50/x.75/x.00 le plus proche (1,81 = 2, 1,32 = 1,50)
  • Arrondir toujours au x.25/x.50/x.75/x.00 le plus proche (1,81 = 1,75, 1,32 = 1,25)
  • Arrondir toujours au x.50/1 le plus proche (1.23 = 1.50, 1.83 = 2)
  • Arrondir toujours au x.50/1 le plus proche (1.23 = 1, 1.83 = 1.50)

J'ai recherché sur Google pendant 2 heures maintenant et les seules choses qui ont été soulevées étaient des forums Excel. Est-ce possible avec quelques lignes simples de PHP?

30
user1649331

Puisque vous cherchez quarts (.00, .25, .50, .75), multipliez votre nombre par 4, arrondissez au nombre entier le plus proche comme vous le souhaitez (floor si bas, ceil si haut), puis divisez par 4.

1.32, jusqu'au quatrième le plus proche:

1,32 * 4 = 5,28
plancher (5.28) = 5.00
5.00/4 = 1.25

Le même principe s'applique pour toutes les autres fractions, telles que thirds ou huitièmes (.0, .125, .25, .375, .5, .625, .75, .875). Par exemple:

1,77, jusqu'au huitième le plus proche:

1,77 * 8 = 14,16
ceil (14,16) = 15,00
15.00/8 = 1.875


Juste pour le plaisir, vous pourriez écrire une fonction comme celle-ci:

function floorToFraction($number, $denominator = 1)
{
    $x = $number * $denominator;
    $x = floor($x);
    $x = $x / $denominator;
    return $x;
}

echo floorToFraction(1.82);      // 1
echo floorToFraction(1.82, 2);   // 1.5
echo floorToFraction(1.82, 3);   // 1.6666666666667
echo floorToFraction(1.82, 4);   // 1.75
echo floorToFraction(1.82, 9);   // 1.7777777777778
echo floorToFraction(1.82, 25);  // 1.8
85
Wiseguy

S'il vous plaît noter que la réponse n'est pas vraiment étanche à l'eau. Comme nous avons affaire à des flottants, il n’est pas garanti que lorsque vous divisez le nombre arrondi par le dénominateur, il retourne un nombre parfaitement arrondi. Il peut renvoyer 1.499999999999 au lieu de 1.5. C'est la nature des nombres en virgule flottante.

Un autre tour est nécessaire avant de renvoyer le numéro de la fonction.

Juste au cas où quelqu'un atterrirait ici de google comme moi :)

3
Bart Guliker

Regardez l'exemple n ° 3 ici et c'est la moitié de votre solution - http://php.net/manual/en/function.round.php

1
Catfish

Selon la fonction mround() dans Excel:

function MRound($num,$parts) {
    $res = $num * $parts;
    $res = round($res);
    return $res /$parts;
}
echo MRound(-1.38,4);//gives -1.5
echo MRound(-1.37,4);//gives -1.25
echo MRound(1.38,4);//gives 1.5
echo MRound(1.37,4);//gives 1.25
1
Aryeh Beitz