Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zaokrąglanie liczb
Forum PHP.pl > Forum > Przedszkole
slawek3422
Cześć.
Utknąłem nad pewnym problemem, pewnie banalnym dla wielu tu obecnych.

Mam liczby, dla których chcę zrobić operację zaokrąglania, jeżeli druga liczba po przecinku jest 1-4 wtedy zaokrąglenie w górę, a od 5-9 zaokrąglenie w dół.

Przykład:

35.04 => 35.10
17.59 => 17.50

Funkcją round(); nie bardzo mi to wychodzi. Jak to sprytnie ogarnąć?
nospor
Zaspokoisz moja ciekawosc i odpowiesz mi czemu chcesz zrobic odwrotnie niz logika wskazuje?
slawek3422
Oczywiście, choć temat jest mocno zawiły.
Właściwie to istnieje jeszcze jeden wariant którego nie ogarniam a jest najczęściej stosowany mianowicie dla cyfr 1-3 zaokrąglamy w dół a 4-9 w górę.

A oto wytłumaczenie.
Jeżeli chciałbyś od naszego wspaniałego rządu zakupić dwie mapy to zapłaciłbyś np. 17,52zł/szt.

17,52 * 2 = 35,04

Nie zapłacił byś 35,04 a gołe 35zł, Państwo idzie Ci na rękę wink.gif

Teraz trzeba wystawić jakiś dokument księgowy i teraz się zaczyna cała jazda.
W dokumencie widnieją dwa produkty po 17,52 co daje w sumie 35,04 a klient zapłacił 35zł więc gdzieś trzeba pokombinować żeby to się bilansowało. I tutaj przychodzi powyższa reguła, dla drugiego miejsca po przecinku zaokrąglamy w dół i wtedy będzie 2x17,50 = 35. Klient zadowolony, księgowa zadowolona smile.gif

Bardziej by mi nawet zależało, żeby ogarnąć ten przypadek niż ten z pierwszego posta.
nospor
Dalej nie kumam tej ksiegowej zaleznosci ale ja nie ksiegowy wiec nie wnikam...


No to uzyj ceil() lub floor() w zaleznosci od tego co na koncu. A to co na koncu to mozesz sprawdzic poprzez zrzutowanie liczby na string i pobranie ostatniego znaku z tego stringa.
trueblue
Wypróbuj tak:

  1. $a = 34.02;
  2. $pow = floor(log10($a - intval($a)));
  3. if(!is_infinite($pow)) {
  4. $a = intval($a) + round(pow(10, $pow + 1) - ($a - intval($a)), abs($pow) - 1);
  5. }
  6. echo $a;


Działa to tak, że zaokrąglana jest odwrotność frakcji dziesiętnej.
Dla 0.02 zaokrąglane jest 0.08, dla 0.1 zaokrąglane jest 0.9.

Poprawka:

  1. $a = 34.02;
  2. $hundredth = round($a * 10 - intval($a * 10), 1) / 10;
  3. if ($hundredth > 0) {
  4. $a = intval($a * 10) / 10 + round(0.1 - $hundredth, 1) / 2;
  5. }
  6. echo $a;
Pyton_000
Ale wiesz że to co chcesz "zrobić" podpada pod przestępstwo skarbowe? To taka dygresja
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.