Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podział floata % na 3 części a zaokrąglanie
Forum PHP.pl > Forum > PHP
duch4ever
Witam, mam nietypowy problem i nie wiem jak to ugryźć smile.gif

Mam zamówienie na kwotę powiedzmy 100zł i w skład którego wchodzą produkty i teraz dajemy rabat na zamówienie 30% więc kwota zamówienia to 70zł.
I teraz muszę proporcjonalnie obniżyć kwotę każdego produktu o 30% ALE tak aby suma była równa 70.00 zł, problem to oczywiście zaokrąglanie kwot bo kiedy cenę każdego z produktów obniżymy o 30% to na na końcu często będzie różnica +1/-1 grosz.

Jest jakiś algorytm który rozwiąże problem? Możne kwotę zrobić jako int i trzeba ją % podzielić na x części bez zaokrąglania.
Miał może ktoś podobny problem?

Z góry dzięki za pomoc!
trueblue
A musisz pokazywać obniżoną cenę każdego produktu? Skoro rabat jest na całość, to mnie jako klienta i tak nie interesuje jaką cenę po zniżce będzie mieć każdy produkt (bo i tak nie kupię jednego).
A jeśli musisz pokazywać, to może na zasadzie CENA zł - 30%. Choć ja bym się kierował tym co napisałem wyżej.
duch4ever
No właśnie muszę bo dane muszę wysłać dalej po API i suma musi się zgadzać.
trueblue
Czyli nie wysyłasz sumarycznej wartości po obniżce, tylko ma ona wynikać z sumy cen produktów po zniżce, tak?

Zakładam, że ceny produktów wchodzących w skład zamówienia są różne (bo jeśli dzielisz po prostu sumę po zniżce np. na 3, to wystarczy, że reszty z zaokrągleń dwóch pierwszych produktów dodasz do ceny trzeciego - będzie po prostu większa lub mniejsza, zależy w jaki sposób będziesz sprowadzał ceny do liczby całkowitej).

Jeśli jednak ceny są różne, to zrobiłbym tak:

1. Obliczasz cenę pierwszego produktu po zniżce.
2. Jeśli nie jest całkowita, to zaokrąglasz do najbliższej najmniejszej (funkcja floor).
3. Resztę wynikającą z zaokrąglenia zapisujesz.
4. Obliczasz cenę kolejnego produktu.
5. Jeśli nie jest całkowita, to dodajesz resztę z punktu 3.
6. Jeśli nadal nie jest całkowita, to zaokrąglasz do najbliższej najmniejszej (funkcja floor).
7. Resztę z wyniku z zaokrąglenia zapisujesz.
8. Jeśli masz do czynienia z ostatnim produktem, to jego cena jest równa sumie całkowitej po zniżce minus sumie cen wcześniejszych produktów po zniżce.
9. Jeśli to nie ostatni produkt, to wracasz do punktu 4.


Dla przykładu:

Ceny: 31, 36, 33

31 - 30% = 21,7.
Obcinam do 21, zapisuję 0,7.

36 - 30% = 25,2. Dodaję 0,7. Mam 25,9, więc nadal nie jest całkowita.
Obcinam do 25, zapisuję 0,9.

33 jest ostatnią, więc obliczam jej cenę jako 70 - (21 + 25) = 70 - 46 = 24. Gdybym obliczał 33 - 30%, to cena wyniosłaby 23,1.
duch4ever
Tak dokładnie, o coś takiego chodzi właśnie.
Chyba takie rozwiązanie się sprawdzi, gdyby jeszcze ktoś miał pomysły to można pisać smile.gif
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-2024 Invision Power Services, Inc.