2009-04-28 9 views
6

Tworzę ten system oceniania, używając gwiazdek 5-ostrzowych. Chcę, aby nagłówek zawierał średnią ocenę. Stworzyłem więc gwiazdki pokazujące 1/5. Używając "1.2" dostanę pełną gwiazdę i jeden punkt na następnej gwieździe i tak dalej ...numer rundy do najbliższego 0,2 z PHP

Ale nie znalazłem dobrego sposobu, aby zaokrąglić się do najbliższego .2 ... Pomyślałem Mógłbym pomnożyć przez 10, a następnie zaokrąglić, a następnie uruchomić przełącznik do rundy 1 do 2, 3 do 4 i tak dalej. Ale to wydaje się nudne i niepotrzebne ...

Odpowiedz

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

niesamowite! Wiedziałem, że musi to być łatwe rozwiązanie. Dzięki ( – peirix

+0

genialne rozwiązanie! Dziękuję! – alumi

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

Więc suma wynosi 25, to byłoby możliwe, aby nie używać pływaków i stosowanie 1-> 25/25? Że nie sposób jest mniej obliczenia potrzebne ... (jeśli w ogóle)

+0

+1 - to dobra uwaga, ale zakładam, że wynik 1,2 lub 1,17 lub cokolwiek jest w rzeczywistości średnią, więc i tak w pewnym momencie pojawią się ułamki – nickf

18

Elastyczne rozwiązanie

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

Elegancki, ale brakuje ci trochę "$" –

+0

Miło, ale ponieważ wiem, że zawsze będę potrzebował ułamka 5, nie ma sensu tworzyć dla niego ogólnej funkcji, ale będę def. miej to na uwadze.Dzięki (: – peirix

+0

Otrzymasz błędy zmiennoprzecinkowe za pomocą tego rozwiązania! –

1

Dlaczego wszyscy dając rozwiązania, które wymagają głębszej inspekcji lub konwersji? Chcesz 0,2? Następnie:

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

Chcesz 5? Następnie:

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

To takie proste.

+0

Ponieważ dostaniesz błędy zmiennoprzecinkowe dzięki temu rozwiązaniu! –