Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]zaokrąglanie liczb
krzesik
post 7.01.2013, 13:06:41
Post #1





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


Witam, mam dziwny przypadek..... Podczas zapisu danych do tabeli MySQL przeliczam wartość faktury. Przeliczanie wartości jest proste, bowiem polega na przemnożeniu ilości przez cenę (wyliczenie wartości brutto)
  1. .......
  2. { // wyliczenie w wart brutto
  3. if (!empty($faktura_brutto)) {
  4. $wartoscbrutto[$x] = round((str_replace(",",".",$ilosc[$x]))*(str_replace(",",".",$cena[$x])),2);
  5. $wartoscvat[$x] = round((str_replace(",",".",$ilosc[$x])*str_replace(",",".",$cena[$x]))*($prc_vat[$x]/(100+$prc_vat[$x])), 2);
  6. $wartoscnetto[$x] = $wartoscbrutto[$x]-$wartoscvat[$x];
  7. }
  8. .........

po zapisie danych pojawia mi się różnica jednego grosza, konkretnie działanie wygląda tak 50 x 2,1 = 105,01

jakieś pomysły?
Go to the top of the page
+Quote Post
muniekw
post 7.01.2013, 13:46:28
Post #2





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Zaokrąglanie:
ceil() góra
floor() dół
Go to the top of the page
+Quote Post
Lysiur
post 7.01.2013, 13:56:37
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 11
Dołączył: 25.07.2012

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


Prawdopodobnie w bazie danych korzystasz z pola typu float. Float ma to do siebie, że nie jest w stanie obsłużyć liczb nieskończych, i zaokrągla je. Niby przy prostych operacjach jest to prawie nieodczuwalne, ale jeśli taka liczba zostanie później pomnożona x100000 to różnica jest znaczna. Do zapisu cen/walut/ etc, wykorzystuje typ pola DECIMAL(11,2) i nie mam problemów, bo zapisuje dokładnie taką wartość jaką trzeba (bez zaokrąglania po tysięcznych częściach).

Go to the top of the page
+Quote Post
krzesik
post 7.01.2013, 14:13:55
Post #4





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


Cytat(Lysiur @ 7.01.2013, 13:56:37 ) *
Prawdopodobnie w bazie danych korzystasz z pola typu float. Float ma to do siebie, że nie jest w stanie obsłużyć liczb nieskończych, i zaokrągla je. Niby przy prostych operacjach jest to prawie nieodczuwalne, ale jeśli taka liczba zostanie później pomnożona x100000 to różnica jest znaczna. Do zapisu cen/walut/ etc, wykorzystuje typ pola DECIMAL(11,2) i nie mam problemów, bo zapisuje dokładnie taką wartość jaką trzeba (bez zaokrąglania po tysięcznych częściach).

hmmmmm, u mnie w bazie jest typ pola Decimal(6,2), to co piszesz jest o i nie ma tu dyskusji, ale przy iloczynie 50 x 2,1 nie ma części setnych a jednak tak mi to do bazy pakuje
Go to the top of the page
+Quote Post
skleps
post 7.01.2013, 18:53:24
Post #5





Grupa: Zarejestrowani
Postów: 142
Pomógł: 9
Dołączył: 3.03.2011

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


Cytat(krzesik @ 7.01.2013, 13:06:41 ) *
jakieś pomysły?


1. Ponieważ to faktury to radzę przeczytać o zaokrąglaniu groszy wg ustawy
2. To co mi doradzono - działania finansowe robić na intach, a jedynie na wejsciu i na wyjściu dodawać/odejmować przecinki.
Inaczej licząc na floatach robią się takie kwiatuszki jak pojawiające się lub znikające grosze.
A tą metoda to w bazie masz INT, w php liczysz na INT, a jedynie musisz mieć dwie funkcje:
a.) zamieniającą dane zewnętrzne na INT
b.) zamieniającą daną INt typu xyzy na string xy.zy

EDIT:
3. Ponieważ to faktury to radzę zwrócić uwagę na liczenie vat "od netto" i "od brutto" i nie pomieszać tego smile.gif

Ten post edytował skleps 7.01.2013, 19:00:35
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: 6.07.2025 - 16:17