Arrondi à la fraction la plus proche (moitié, quart, etc.)

Donc, j'ai besoin de créer les fonctions suivantes mais ma tête ne peut penser à aucune possibilité en PHP sans mathématiques compliquées.

  • Ronde toujours, jusqu'à la décimale près (1.81 = 1.90, 1.89 = 1.90, 1.85 = 1.90)
  • arrondir TOUJOURS {[5] } à la décimale la plus proche (1.81 = 1.80, 1.89 = 1.80, 1.85 = 1.80)
  • Round TOUJOURS {[5] } jusqu'au X. 25 / X. 50 / X. 75 / x le plus proche.00 (1.81 = 2, 1.32 = 1.50)
  • arrondir TOUJOURS {[5] } jusqu'au X. 25 le plus proche / X. 50 / x. 75 / x.00 (1.81 = 1.75, 1.32 = 1.25)
  • Round TOUJOURS {[5] } jusqu'au x le plus proche.50 / 1 (1.23 = 1.50, 1.83 = 2)
  • arrondir TOUJOURS {[5] } jusqu'au x le plus proche.50 / 1 (1.23 = 1, 1.83 = 1.50)

J'ai cherché sur Google pendant 2 heures maintenant et les seules choses qui sont apparues étaient des forums Excel. Est-ce possible avec quelques lignes simples de PHP?

29
demandé sur Wiseguy 2013-02-16 01:11:15

4 réponses

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

1.32, vers le bas au quatrième le plus proche:

1.32 * 4 = 5.28
plancher ( 5.28) = 5.00
5.00 / 4 = 1.25

Même principe s'applique pour toutes les autres fractions, comme tiers 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 pouvez écrire une fonction comme ceci:

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
80
répondu Wiseguy 2013-02-15 22:45:34

Veuillez noter que la réponse n'est pas vraiment étanche à l'eau. Puisque nous avons affaire à des flotteurs ici, il n'est pas garanti que lorsque vous divisez le nombre arrondi par le dénominateur, il renvoie un nombre soigneusement rond. Il peut renvoyer 1.499999999999 au lieu de 1.5. C'est la nature des nombres à virgule flottante.

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

Juste au cas où quelqu'un atterrit ici de google comme je l'ai fait:)

3
répondu Bart Guliker 2015-03-11 10:45:03

Oeil à l'exemple #3 sur ici et c'est la moitié de votre solution - http://php.net/manual/en/function.round.php

1
répondu Catfish 2013-02-15 21:15:27

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
répondu Aryeh Beitz 2016-09-04 07:38:36