2009-04-28 5 views
6

Je crée ce système de notation en utilisant des étoiles à 5 tranchants. Et je veux que le titre inclue la note moyenne. J'ai donc créé des étoiles montrant 1/5èmes. En utilisant "1.2" j'obtiendrai une étoile pleine et un point sur la prochaine étoile et ainsi de suite ...arrondir le nombre à 0.2 le plus proche avec PHP

Mais je n'ai pas trouvé un bon moyen d'arrondir au plus proche .2 ... Je pensais Je pourrais multiplier par 10, puis arrondir de, et puis passer un commutateur au tour 1 jusqu'à 2, 3 jusqu'à 4 et ainsi de suite. Mais cela semble fastidieux et inutile ...

Répondre

27
round(3.78 * 5)/5 = 3.8 
+0

génial! Je savais qu'il devait y avoir une solution facile à cela. Merci (: – peirix

+0

une solution brillante! Merci! – alumi

4
function round2($original) { 
    $times5 = $original * 5; 
    return round($times5)/5; 
} 
3

Donc, votre total est de 25, serait-il possible de ne pas utiliser des flotteurs et utiliser 1-> 25/25? De cette façon, il y a moins de calculs nécessaires ... (le cas échéant du tout)

+0

+1 - c'est un bon point, mais je suppose que le score de 1,2 ou 1,17 ou quoi que ce soit est en fait une moyenne, donc il y aura des fractions impliquées à un moment donné de toute façon – nickf

18

Une solution flexible

function roundToNearestFraction($number, $fractionAsDecimal) 
{ 
    $factor = 1/$fractionAsDecimal; 
    return round($number * $factor)/$factor; 
} 

// Round to nearest fifth 
echo roundToNearestFraction(3.78, 1/5); 

// Round to nearest third 
echo roundToNearestFraction(3.78, 1/3); 
+0

Elégant, mais il vous manque quelques "$" –

+0

Bien, mais comme je sais que je vais toujours avoir besoin d'une fraction de 5, il n'y a vraiment aucun intérêt à créer une fonction générale. Merci (: – peirix

+0

Vous obtiendrez des erreurs à virgule flottante avec cette solution! –

1

Pourquoi tout le monde donne des solutions qui nécessitent une inspection plus approfondie ou de conversion? Voulez-vous 0.2? Puis:

round($n/0.2) * 0.2; // $n = 3.78/0.2 = 18.9 (=) 19 * 0.2 = 3.8 // 

Vous voulez 5? Puis:

round($n/5) * 5; // $n = 17/5 = 3.4 (=) 3 * 5 = 15 // 

C'est aussi simple que cela.

+0

Parce que vous obtiendrez des erreurs à virgule flottante avec cette solution! –

Questions connexes