2009-10-20 14 views
7

chciałbym rozwiązać za pomocą mechanizmu zaokrąglania php4,5.2 i poniżej (nie 5.3) Obecnie robie 0,05 zaokrąglania, coś jak tej strony:Zaokrąglanie Mechanizm do najbliższego 0,05

http://www.bnm.gov.my/index.php?ch=209&pg=657&ac=568

before rounding | after rounding 

      89.90 | 89.90 

      89.91 | 89.90 

      89.92 | 89.90 

      89.93 | 89.95 

      89.94 | 89.95 

      89.95 | 89.95 

      89.96 | 89.95 

      89.97 | 89.95 

      89.98 | 90.00 

      89.99 | 90.00 

Próbuję użyć ciągu, aby go podzielić i ręcznie dodać, ale nie jest to dobre rozwiązanie, mając nadzieję, że tutaj znajdzie kogoś, kto go rozwiąże.

+0

funkcja rndfunc ($ x) { okrągły zwrotny ($ x * 2, 1)/2; } to działa! Wielkie dzięki Mauris – Shiro

+0

Jeśli jedna odpowiedź rozwiązała Twój problem, kliknij duży znacznik obok swojej odpowiedzi. – random

+0

@Shiro - tak jak powiedział e.c.ho, połóż znacznik, aby kiedy inni przychodzili na to pytanie, znali odpowiedź. – mauris

Odpowiedz

10

zastosowanie tej funkcji

function rndfunc($x){ 
    return round($x * 2, 1)/2; 
} 
+0

Kończy się tylko jedna liczba po przecinku, jeśli kończy się na zero (0). – random

+2

następnie można po prostu sformatować go za pomocą number_format() – mauris

+2

sprintf ('% 0.2f', rndfunc ($ x)); – Nathan

0

Mnożenie przez dwa, a następnie zaokrąglanie, a następnie dzielenie przez dwa.

+3

's/two/twenty/g' – hobbs

1

Po prostu chcesz zmapować wartości do siatki. Siatka jest zdefiniowana jako a multiple of .05. Ogólnie rzecz biorąc, musisz znaleźć mnożniki, których wartość znajduje się pomiędzy.

To, co nie jest w tabeli, to liczby ujemne. Musisz zdecydować, czy zaokrąglić od zera (symetrycznie), czy zawsze w tym samym kierunku (tj. Dodatni).

Kod:

$step = .05; 
$multiplicand = floor($value/$step); 
$rest = $value % $step ; 
if($rest > $step/2) $multiplicand++; // round up if needed 
$roundedvalue = $step*$multiplicand; 
+0

Istnieje podział na zero w linii' $ rest = '. – random

+0

@ e.c.ho: jak to możliwe, jeśli '$ step' nie jest zerem? – xtofl

+0

Przebiegł kod i to jest komunikat o błędzie, który przyleciał z powrotem. – random

5

Koncepcyjnie, procedura może być wykonane jako:

  1. dzielenia przez 0,05
    • mnożenie przez (1/0,0 5)
  2. zaokrąglenie do najbliższej liczby całkowitej
  3. mnożąc przez 0,05
0

wskazówki: -

$ input1 = 24,05;

$ things = abs ($ input * 20); // 481 ".05" s

$ tenpcnt = abs ($ rzeczy/10); // 48 ".05" s

$ ouput = $ tenpcnt/20;

echo $ ouput; // 2,40

0
function round5Sen ($value) { 

    return number_format(round($value*20,0)/20,2,'.',''); 
} 

echo round5Sen(155.13); 
echo "\n"; 
echo round5Sen(155.12); 
echo "\n"; 
echo round5Sen(155.0); 
echo "\n"; 
echo round5Sen(155.18); 
echo "\n"; 
0

Jestem pewien, że są bardziej eleganckie rozwiązania, ale to wydaje się spełnić zadanie:

<?php 

// setup test 
$start_num = 89.90; 
$iterations = 10; 

// loop through test numbers 
for ($i = 0; $i < $iterations; $i++) { 
    nickleRound($start_num + (0.01 * $i)); 
    echo "\n\n"; 
} 

// 
function nickleRound($num) { 
    $p = 0.05; 
    echo "\n" . 'p= ' . $p; 

    $num = round($num, 2); 
    echo "\n" . 'num= ' . $num; 

    $r = ($num/$p); 
    echo "\n" . 'r= ' . $r; 

    $r2 = ceil($r) - $r; 
    echo "\n" . 'r2= ' . $r2; 

    $a = round($num, 1); 
    if (($r2 > 0) && ($r2 < 0.5)) { 
    $a = $a + 0.05; 
    } 
    echo "\n" . 'a= ' . $a; 
} 
+0

Mauris wygrywa - Pomyślałem, że istnieje prostsza metoda. (-: – Nathan

0

Expanding trochę @xtofl aby umożliwić bardziej precyzyjnych kroków (nie technicznie wymagane dla tego pytania)

$step   = 0.0005; 
    $multiplicand = floor($value/$step); 
    $rest   = fmod($value, $step); 

    $value = $step * $multiplicand; 

    if ($rest > $step/2) { 
     $value += $step; 
    } 
0
//Round to nearest 0.05 
echo round ($number * 20, 0)/20; 

//Round Up to nearest 0.05 
echo ceil ($number * 20)/20; 

//Round Down to nearest 0.05 
echo floor ($number * 20)/20; 
0

Dziękuję @mauris za rozwiązanie rozwiązać mój problem na Malezja GST roundi ng mechanizm. Działa również w SQL.

DECLARE @tempTable AS TABLE (Number Decimal (20,4));

WKŁADKA DO @tempTable WARTOŚCI (89,90), (89,91), (89,92), (89,93), (89,94), (89,95), (89,96), (89,97), (89,98), (89,99)

wybrać numer okrągły (liczba * 2, 1)/2 CO 'zaokrąglony' Z @tempTable

Powiązane problemy