Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Zaokrąglanie liczb
slawek3422
post 6.08.2021, 12:16:08
Post #1





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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ąć?

Ten post edytował slawek3422 6.08.2021, 12:17:40
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
nospor
post 6.08.2021, 12:20:33
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zaspokoisz moja ciekawosc i odpowiesz mi czemu chcesz zrobic odwrotnie niz logika wskazuje?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
slawek3422
post 6.08.2021, 12:28:09
Post #3





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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.

Ten post edytował slawek3422 6.08.2021, 12:29:56
Go to the top of the page
+Quote Post
nospor
post 6.08.2021, 13:18:57
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post 7.08.2021, 14:17:33
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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;


Ten post edytował trueblue 7.08.2021, 14:20:42


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 19.08.2021, 09:20:34
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ale wiesz że to co chcesz "zrobić" podpada pod przestępstwo skarbowe? To taka dygresja
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.07.2025 - 00:24