Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PHP _ Podział floata % na 3 części a zaokrąglanie

Napisany przez: duch4ever 5.11.2019, 16:27:39

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!

Napisany przez: trueblue 5.11.2019, 16:51:34

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.

Napisany przez: duch4ever 5.11.2019, 17:35:36

No właśnie muszę bo dane muszę wysłać dalej po API i suma musi się zgadzać.

Napisany przez: trueblue 5.11.2019, 18:30:30

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.

Napisany przez: duch4ever 6.11.2019, 15:11:55

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)