Nie tak szybko z tymi zaokrągleniami.
Jeśli zmienna będzie Currency to nie ma problemu.
Jednak jeśli zmienna będzie typu innego (single, double, float32) to zostanie sformatowana przy pomocy FormatFloat w sposób niezgodny z polską rachunkowością (z amerykańską będzie zgodna).
Dla przypomnienia:
Kwoty wykazywane na fakturze zaokrągla się do pełnych groszy, przy czym końcówki poniżej 0,5 grosza pomija się, a końcówki od 0,5 grosza (czyli – uwaga! – równe 0,5 grosza albo wyższe od 0,5 grosza) - zaokrągla się do 1 grosza.
w przypadku gdy zmienna będzie innego typu niż Currency zaokrąglenie będzie nieprawidłowe (w Polsce jak już pisałem).
Oto przykłady:
Kopiuj
var
liczba: Single;
begin
liczba := 1.255;
lblWyjscie.Caption := FormatFloat('0.00', liczba);
liczba := 1.355;
lblWyjscie.Caption := FormatFloat('0.00', liczba);
end;
Jak pisałem, nie jest to zgodne z naszą rachunkowością fiskalną.
W cywilizowanym świecie, liczby parzyste zaokrągla się w dół a nieparzyste w górę. Jest to uczciwe bo średnia zbliża się do 50%. U nas państwo łupi nas na pół groszówkach w podatkach - można się już było przyzwyczaić.
Jak to rozwiązać? Można utworzyć sobie funkcję która zaokrągli w sposób zgodny z naszą rachunkowością, np. taką:
Kopiuj
function CashRound(Cash: Extended): Currency;
begin
if Cash > 0 then
Result := Round((Cash + 0.00000001) * 100) / 100
else
Result := Round((Cash - 0.00000001) * 100) / 100;
end;
i problem rozwiązany.
Kopiuj
var
liczba: Single;
begin
liczba := 1.255;
lblWyjscie.Caption := FormatFloat('0.00', CashRound(liczba);
liczba := 1.355;
lblWyjscie.Caption := FormatFloat('0.00', CashRound(liczba);
end;
katakrowakatakrowa