Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sklep internetowy - groszowy szał
wujek2009
post
Post #1





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

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


Cześć.

W jaki sposób podchodzicie do przechowywania cen produktów w bazie danych i późniejsze ich wyświetlanie oraz kalkulowanie (odejmowanie, dodawanie) - tak, aby po zaokrągleniu był wynik ten sam co na kalkulatorze. Number Format zaokrągla w zły sposób w konsekwencji ceny nie nakładają się na siebie.
Go to the top of the page
+Quote Post
nospor
post
Post #2





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




Ale po co ci do dodawanie czy odejmowania number format? Jesli masz
2.34 + 4.21 to po co tutaj number format? Number format to se mozesz co najwyzej uzyc przy wyswietleniu wyniku, a nie podczas wyliczania wyniku

Poza tym, by uniknac ewentualnych problemow z dzialaniem na liczbach rzeczywistych, warto trzymac kwoty w bazie jako INT - liczba groszy, a nie zlotowek


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

"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
wujek2009
post
Post #3





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

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


Problem w tym, że cały czas zaokrągla groszem w górę.
  1. $a = 10.48888;
  2. $b = 2;
  3.  
  4. $wynik = $a+$b;
  5. var_dump(number_format($wynik, 2));


Wynik php: 12.49
Wynik, który mnie interesuje: 12.48

Jak zmienię zmienną $a na "10.48" bez tego dłuższego ogonu to wszystko jest w porządku. Więc szukamy funkcji, która UTNIE mi reszte cyfr po przecinku (dwa miejsca), ale nie będzie zaokrąglać jak 48 to zaokrągli do 49, itd..
Go to the top of the page
+Quote Post
nospor
post
Post #4





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




Co ty masz za sklep, ze trzymasz w nim wartosci 10.48888 ? Jesli to jest wynik jakis obliczen, to po zaokrągleniu powinnno byc wlasnie 10.49 a nie 10.48

Jesli nadal sie upierasz na niezaokrąglaniu, to zrzutuj liczbe na stringa i srob poprostu substr()


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

"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
memory
post
Post #5





Grupa: Zarejestrowani
Postów: 616
Pomógł: 84
Dołączył: 29.11.2006
Skąd: bełchatów

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


http://interpretacja-podatkowa.pl/interpre...lanie-kwot.html
Go to the top of the page
+Quote Post
markuz
post
Post #6





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


Proponuję ceil. W komentarzach znajdziesz funkcję ceil_dec która powinna Ci wystarczyć.


--------------------
Go to the top of the page
+Quote Post
widmo_91
post
Post #7





Grupa: Zarejestrowani
Postów: 109
Pomógł: 25
Dołączył: 10.08.2009

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


Przede wszystkim w bazie kwoty powinieneś przechowywać jako typ DECIMAL z 2 miejscami po przecinku a nie jakieś FLOATY.

Jeżeli problem nadal by występował z jakiegoś powodu to zapoznaj się z funkcją floor floor w pierwszym komentarzu masz rozwiązanie dokładnie twoje problemu.
Go to the top of the page
+Quote Post
tczajka
post
Post #8





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 23.07.2013

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


Ja ostatnimi czasy zawsze kwoty w bazie przechowuję z dokładnością do 4 miejsc po przecinku - właśnie przez wzgląd na dokładność przy np przeliczaniu. a Wyświetlam oczywiście zaokrąglone do 2 miejsc po przecinku.
Go to the top of the page
+Quote Post
widmo_91
post
Post #9





Grupa: Zarejestrowani
Postów: 109
Pomógł: 25
Dołączył: 10.08.2009

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


@up
gratuluję pomysłowości oneeyedsmiley02.png

Jakby nie było typu decimal i podobnych to bym prędzej używał liczb całkowitych i przy wyciąganiu dzielił to przez 100, przynajmniej można by było wtedy skorzystać z operatora = w zapytaniach.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





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

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


Cytat
Przede wszystkim w bazie kwoty powinieneś przechowywać jako typ DECIMAL z 2

Tak o ile zostaną zaokrąglone w odpowiedni sposób. Dlatego trzymanie w bazie kwot do 4 miejsc po przecinku jest dla mnie jak najbardziej odpowiednie.
Jest może troszkę większy nakład pracy i czujności na operowaniu tego typu danymi ale potem jest pewność że wszystko sie zgadza.

@up i nie wiem co Cię tak szokuje w większej ilości miejsc po ,
Go to the top of the page
+Quote Post
widmo_91
post
Post #11





Grupa: Zarejestrowani
Postów: 109
Pomógł: 25
Dołączył: 10.08.2009

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


@up W programowaniu/projektowaniu dobrą cechą jest nakładanie sobie ograniczeń dzięki czemu program jest mniej podatny na błędy.

Na pewno istnieją sytuację gdzie należy przechowywać większą liczbę miejsc po przecinku np. przy przeliczenia podatku VAT. Tylko, że nie jest to kwestia wyboru i ostrożności pisania kodu tylko konieczność. Na pewno nie ma takiej reguły.

Na stronie i tak trzeba podać cenę z 2 miejscami, gdyby była sytuacja, że przechowywane są 4 miejsca i cena 2 różnych produktów wynosi 1,00 to po ich dodaniu i zaokrągleniu (zależnie od sposobu zaokrąglania) moglibysmy otrzymać cenę różną o grosz, gdyby zaokrąglać te produkty za każdym razem z osobna (żeby otrzymać prawidłową sumą) to po co trzymać więcej miejsc i dodawać sobie roboty.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #12





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

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


@up smile.gif
Jeżeli będziesz miał popisane metody dla produktu które przeliczają ceny (metody w jednym miejscu a nie porozwalane po xx klasach) to jeżeli są one poprawnie napisane i korzysta się tylko z nich do tego celu to nie ma żadnego kłopotu smile.gif

Ale owszem jeżeli widzę kwiatki które przeliczają sumę koszyka w każdym jego kroku w całości i od nowa to już się mija kompletnie z celem.
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 Aktualny czas: 22.08.2025 - 03:22