zakrąglanie pl/sql

0

witam wszystkich
mam pytanie - potrzebuję funkcji w pl/sql'u która zaokrąglałaby ceny w następujący sposób: jeżeli grosze 1-5 zaokrąglenie w dół, 6-9 zaokrąglenie w górę. Mam funkcję w Delphi:

function TForm1.Zaokragl(Kwota : real) : real;
var
    Zlotowki, Grosze : string;
    i : integer;
    Cyfra : string;
begin
    Zlotowki := Copy(FloatToStr(Kwota), 1, Pos('.', FloatToStr(Kwota)) - 1);
    Grosze := Copy(FloatToStr(Kwota), Pos('.', FloatToStr(Kwota)) + 1, Length(FloatToStr(Kwota)));

    for i := Length(Grosze) downto 3 do begin
        //jeśli większa od 5, to podnosimy poprzednią
        if StrToInt(Grosze[i]) > 5 then begin
            Cyfra := Grosze[i - 1];
            Grosze[i - 1] := IntToStr(StrToInt(Cyfra) + 1)[1];
        end;
        Delete(Grosze, Length(Grosze), 1);
    end;

nie jestem programistą - stąd te pytanie

0
seb napisał(a)

nie jestem programistą

To widać po powyższej funkcji. :)

Można to załatwić formatowaniem. Nie mam w domu Oracle więc nie podam gotowego rozwiązania. Poszukaj w dokumentacji.

0

MOżna SQLem:

"ROUND(e, [n])
Przekazuje zaokrąglenie e do n miejsc po przecinku. Jeśli pominięto n, jest to zaokrąglenie do zera miejsc po przecinku. Jeśli n jest ujemne, zaokrągla się cyfry na lewo od przecinka dziesiętnego. "

0

Formatowanie ani ROUND same nie pomogą z tej prostej przyczyny, że przy matematycznym zaokrąglaniu cyfra 5 jest zaokrąglana w górę (upewnij się też, czy na pewno powinna być zaokrąglona w dół, jest to kompletnie nielogiczne, aczkolwiek wiele osób ten błąd popełnia).

IF zmienna*100-floor(zmienna*100)>5 
THEN zmienna := CEIL(zmienna*100)/100 
ELSE zmienna := FLOOR(zmienna*100)/100
END IF;

"zaokrągli" zmienną zmienna zgodnie z Twoimi oczekiwaniami. Być może musisz użyć innej potęgi 100 (nie pamiętam, czy chodziło o grosze, a nie mam jak podejrzeć). Jeśli chcesz mieć funkcję, to "opakuj" to kodem funkcji.

0
Ister napisał(a)

Formatowanie ani ROUND same nie pomogą z tej prostej przyczyny, że przy matematycznym zaokrąglaniu cyfra 5 jest zaokrąglana w górę (upewnij się też, czy na pewno powinna być zaokrąglona w dół, jest to kompletnie nielogiczne, aczkolwiek wiele osób ten błąd popełnia).

IF zmienna100-floor(zmienna100)>5
THEN zmienna := CEIL(zmienna100)/100
ELSE zmienna := FLOOR(zmienna
100)/100
END IF;

> 
> "zaokrągli" zmienną zmienna zgodnie z Twoimi oczekiwaniami. Być może musisz użyć innej potęgi 100 (nie pamiętam, czy chodziło o grosze, a nie mam jak podejrzeć). Jeśli chcesz mieć funkcję, to "opakuj" to kodem funkcji.


Moi kochani zaokrąglenie w dół istnieje, jak najbardziej jest wykorzystywane wręcz powszechnie w procedurach dot. księgowości.
I wszelkich systemów finansowych w wielu krajach w tym w Polsce.
Bo jak masz 13groszy podzielić na 2 osoby to jedna dostanie 7groszy a druga 6groszy. To tyle.
proszę zwrócić uwagę na proste zapytanko:     select round(0.65,1), trunc(0.65,1) from dual
wynik 0.7   0.6
0

Hmmm, mie zwraca dla .5 sufit http://ideone.com/Qvrvh

1 użytkowników online, w tym zalogowanych: 0, gości: 1