Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]zaokrąglanie liczb
Forum PHP.pl > Forum > Przedszkole
krzesik
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?
muniekw
Zaokrąglanie:
ceil() góra
floor() dół
Lysiur
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).

krzesik
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
skleps
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
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-2025 Invision Power Services, Inc.