Bartosz Gala pisze:
witam, pisałem już kilkakrotnie na bts, ale ostatnio bez odzewu :(
chodzi o wystawianie FV z dużą ilością produktów, przy takiej pozycji lms źle wylicza końcówki np:
70szt x 121,31zł netto = 8491,70zł netto, 10359,87zł brutto a lms wylicza: 10360zł brutto (netto jest ok)
i nie jest to problem przeliczania sztuk najpierw x netto a dopiero potem na brutto, czy odwrotnie bo wychodzi tak samo, bardziej jest to problem z zaokrąglaniem końcowek (taka moja opinia).
Teraz mam kilka FV które do mnie wróciło z innych firm z prośbą o korekte, więc staram się jakoś zmieniać zeby była jedna pozycja, ale nie jest to rozwiązanie docelowe. Bo przecież program powinien wyliczać prawidłowow.
PHP nie powinien traktować kwot jako float. Float ma taką właściwość, że błędy na groszach sumują się... a do tego większość naszych ułamków dziesiętnych w systemie dwójkowym ma reprezentację okresową.
Przy małej ilości sum kwota nie odbiega od tego co ma być, ale uwidacznia się to przy większej ilości operacji.
--
Widzę dwa rozwiązania. Policzyć to z końcowej kwoty netto... no ale podatki mogą być różne (7%, 22%), więc chyba odpada.
Druga możliwość to zastosowanie liczb stałoprzecinkowych. Wtedy całą liczbę traktujemy jako liczbę całkowitą, a w odpowiednim momencie dokładamy przecinek do wyniku końcowego (np. mnożymy razy 100, albo więcej i pamiętamy, żeby przy wyświetlaniu podzielić przez taką samą liczbę :P ... tylko trzeba sprawdzić, czy PHP z float zrobił nam integer).
Wystarczy policzyć kwoty brutto (które wychodzą dla pojedyńczych operacji prawidłowe) i zsumować je zaokrąglone do dwóch miejsc po przecinku, jako liczby całkowite.
--
No i takie krótkie podsumowanie - liczby zmiennoprzecinkowe nie nadają się do księgowości... na końcu nigdy nie ma 100% gwarancji, że otrzymany wynik jest dokładny.
!DSPAM:47c85514300499210314635!